2014-07-06 2 views
1

현재 PHP로 사용자 정의 장바구니를 작성 중입니다.다차원 배열에서 다중 물음표 키 값 쌍을 검색하는 방법

카트에 추가 할 수있는 각 제품에는 데이터베이스의 제품 ID에 대해 PID와 고유 디자인 ID에 대해 2 개의 변수가 있습니다. 모든 제 제품은 맞춤형 제품이므로 필요한 2 가지 주요 변수입니다.

사용자가 빈 장바구니에 항목을 추가하면 $ _SESSION이 cart_array라는 다차원 배열로 만들어집니다. 동일한 항목이 추가되면 cart_array에서 일치하는 키 값 쌍을 검색하고 새 배열을 추가하는 대신 수량을 늘릴 수 있습니다. 그러나 한 쌍의 값만 일치시킬 수 있습니다. 하나의 키 값 쌍 (pid = 게시 된 pid)을 가진 배열을 찾아서 동일한 배열에 다른 일치하는 키 값 쌍이 있는지 (즉, 게시 된 것이 있는지) 확인해야합니다.

<?php 
if (isset($_POST['pid'])) { 
$pid = $_POST['pid']; 
$did = $_POST['did']; 
$wasFound = false; 
$i = 0; 

// If the cart session variable is not set or cart array is empty 
if (!isset($_SESSION["cart_array"]) || count($_SESSION["cart_array"]) < 1) { 
// RUN IF THE CART IS EMPTY OR NOT SET 
    $_SESSION["cart_array"] = array(1 => array("item_id" => $pid, "did" => $did, "quantity" => 1)); 
} else { 

// RUN IF THE CART HAS AT LEAST ONE ITEM IN IT 
    foreach ($_SESSION["cart_array"] as $each_item) { 
$i++; 
if (array_key_exists("pid", $each_item) && $pid == $each_item["pid"]) { 
     // That item is in cart already so let's adjust its quantity using array_splice() 
     array_splice($_SESSION["cart_array"], $i-1, 1, array(array("did" => $did, "item_id" => $pid, "quantity" => $each_item['quantity'] + 1))); 
     $wasFound = true; 
} // close if condition 
} // close foreach loop 

if ($wasFound == false) { 
array_push($_SESSION["cart_array"], array("item_id" => $pid, "did" => $did, "quantity" => 1)); 
} 
} 
header("location: cart.php"); 
exit(); 
} 
?> 

나는 분명히했으면한다. 조정할 코드는 아마도 알고 있습니다. 일치 $의 PID를 발견 배열도 일치하는 $가 Quadtree 사용

답변

0

새로운 변수 :

$doubleCheck = "$pip,$did"; 
만들어

새로운 카트 :

$_SESSION["cart_array"] = array(1 => array("item_id" => $pid, "did" => $did, "doubleCheck" => $doubleCheck, "quantity" => 1)); 

반복 항목이 추가 :

if (array_key_exists("doubleCheck", $each_item) && $doubleCheck = $each_item["doubleCheck"]) { 

새로운 항목이 추가 :

array_splice($_SESSION["cart_array"], $i-1, 1, array(array("did" => $did, "item_id" => $pid, "doubleCheck" => $doubleCheck, "quantity" => $each_item['quantity'] + 1))); 

내가 원하는 방식으로 작동하는 것 같습니다. 변수를 살균하는 것은 나중에 코드에서 조금씩 발생합니다.

0

을 한 경우

if (array_key_exists("pid", $each_item) && $pid == $each_item["pid"]) { 

나는 그것을 볼 수 있도록 뭔가를 추가해야합니다.

기본적으로, 그것의 PRODUCT_ID 이전 항목 에 비해 그 design_id 이전 항목 보다 크거나 작은 지 여부 크거나 작은 지 여부를 물어 줄 새로운 각 항목에 대해 두 번

구현 이진 트리처럼 그런 다음 새 항목을 적절히 배치하십시오.

비교적 저장하기 쉽고 찾기가 쉽습니다.

+0

연구에 새로운 뭔가를 제공해 주셔서 감사합니다. 이것은 가능성 일지 모르지만 나는 스스로 가르친 개발자이고 이것을 조사해야 할 것입니다. 감사합니다 –

0

여기에 몇 가지 문제가 있습니다. 세션의 첫 번째 항목은 인덱스 0이 아닌 1부터 시작해야한다고 생각합니다. 따라서 다음과 같이 바꾸십시오.

$_SESSION["cart_array"] = array(1 => array("item_id" => $pid, "did" => $did, "quantity" => 1)); 

당신이 돈 때문에 ', 당신은 증가 할 필요가있는 경우 또한

$_SESSION["cart_array"] = array(
    array("item_id" => $pid, "did" => $did, "quantity" => 1,) 
); 

, 그 배열 요소가 이미 존재 의미 - 나는 당신이 동일 할 제안, 조금 너무 싸서 한 그것은 크게 가독성 증가 내가 말할 수있는 한 array_splice 할 필요가 없습니다. 그냥 이렇게 세션에서 찾을 : 당신이 볼 수 있듯이,이 너무 $i에 대한 필요성을 제거

foreach ($_SESSION["cart_array"] as $index => $each_item) { 
    if (array_key_exists("pid", $each_item) && $pid == $each_item["pid"]) { 
     // That item is in cart already so let's increment its quantity 
     $_SESSION["cart_array"][$index]['quantity']++; 
     $wasFound = true; 
    } 
} 

.

는 (제외 :.. 그들은 정수 경우 piddid에 대한 사용자 입력을 복용하고 그들을 untainting 않고 데이터 구조로 추가되는 보안 문제에 나중에 야기 할 수있는, 안전 (int)로 캐스팅).

+0

내 질문에 대답 시간을내어 주셔서 감사합니다 Halfer, 귀하의 의견을 도왔습니다. 나는 이것이 대답하기가 더 쉬울 것이라고 생각했고 아마도 다른 'if'또는 'while'조건이 제안 될 것이라고 생각했다. $ did와 $ pid가 함께 추가 된 새 변수를 만들려고하므로 배열의 키 값 쌍 중 하나만 확인하면됩니다. –

+0

걱정할 필요가없는 @Lil, 도와 줘서 기쁩니다. – halfer

관련 문제