2016-08-26 9 views
-1

私はプロジェクトのためにカートに取り組み、問題を抱えています。私は本当にそれを自分自身で整理しようとしましたが、同じ問題です。 基本的に、人々はカートに送るためのドロップダウンメニューから靴のサイズを選択します。そしてコードがチェックされます:連想配列を別の配列の末尾に追加する方法は?

  • をセッションカート内の値がすでにある-if:同じ値がidと大きさのために、我々は既存の値-if
  • の数量を増やす場合は、すでに値が存在セッションカートで:id値が同じでサイズ値が異なる場合は、それは新しい値で、 に既存の値を追加します。

    最初にコードが正常に動作するかどうかチェックするために、セッションカート内の既存の値をチェックします。同じIDで同じサイズの場合、qtyは上がります。

    問題は2番目のチェックにあります。ドロップダウンで別のサイズを選択しても同じアイテムIDを使用すると、新しい値(IDとサイズ)がカートの既存の値を消去するだけです。アイテムIDは同じですが、異なるサイズを持っている場合、それは新しい値であり、その配列の値が新しい値としてセッションカートの最後に追加する必要がありますどのような私がしたいことということです

ここで

は私のコードです:ここでは

<?php 
    $items = array(
    array('id' => '1', 'desc' => 'sneaker','price' => 24.95, 'size'=>'424546'), 
    array('id' => '2', 'desc' => 'Reebok','price' => 200, 'size'=>'323845'), 
    array('id' => '3', 'desc' => 'Songs of the Goldfish (2CD set)','price' => 19.99), 
    array('id' => '4', 'desc' => 'Simply JavaScript (SitePoint)', 'price' => 39.95) 
); 

session_start(); 
if (!isset($_SESSION['cart'])) { 
$_SESSION['cart'] = array(); 
} 

if (isset($_POST['action']) and $_POST['action'] == 'Buy') { 
$size=""; 
//Get the values for the post and make sure they are integers 
$pid = filter_var($_POST['id'], FILTER_VALIDATE_INT, array('min_range'=> 1)); 
$size = $_POST['doSize']; 
if (isset($_SESSION['cart'][$pid])) { 

    foreach ($_SESSION['cart'] as $key) { 

if ($key['id'] === $pid and $key['size'] !== $size) { 
     echo "NOT SAME SIZE"; 
     $si = $size; 
$_SESSION['cart'][$key['id']] = array('id'=>$pid, 'size'=>$si, 'quantity'=>1); 

     } 

     elseif ($key['id'] === $pid and $key['size']=== $size) { 
     $_SESSION['cart'][$key['id']]['quantity']++; 
      echo "YES CORRECT"; 
     } 
    }//end foreach 
    print_r($_SESSION['cart']); 
}//end isset session cart 

else{ 
$_SESSION['cart'][$pid]= array('id'=>$pid, 'size'=>$size, 'quantity'=>1); 

foreach ($_SESSION['cart'] as $key) { 
     echo $key['id']; 
    } 

print_r($_SESSION['cart']); 
    } 
}//END POST 
include'cat.html'; 

//unset($_SESSION['cart']); 
?> 

cart.html

<!DOCTYPE html> 
    <head> 
    <title>Product catalog</title> 
    <meta http-equiv="content-type" 
    content="text/html; charset=utf-8" /> 
    <style type="text/css"> 
table { 
border-collapse: collapse; 
} 
td, th { 
border: 1px solid black; 
} 
</style> 
</head> 
<body> 
<p>Your cart contains <?php echo count($_SESSION['cart']);?> item(s).</p> 
<p><a href="?cart">View your cart</a></p> 
<table border="1"> 
<thead> 
<tr> 
<th>Item Description</th> 
<th>Price</th> 
<th>Size</th> 
</tr> 
</thead> 

<tbody> 
<?php foreach ($items as $item): ?> 
<tr> 
<td><?php echo $item['desc']; ?></td> 
<td> 
$<?php echo number_format($item['price'], 2); ?> 
</td> 
<td> 

<form action="" method="post"> 

<?php if (isset($item['size'])) { ?> 

<select name="doSize"> 
<?php foreach(str_split($item['size'], 2) as $size):?> 
<option value="<?php echo $size;?>"><?php echo $size;?></option> 
<?php endforeach;?> 


</select> 
<?php }?> 
    </td> 

<td> 
<div> 
<input type="hidden" name="id" value="<?php echo $item['id']; ?>"/> 
<input type="submit" name="action" value="Buy"/> 
</div> 
</form> 
</td> 
</tr> 
<?php endforeach; ?> 
</tbody> 
</table> 
<p>All prices are in imaginary dollars.</p> 
</body> 
</html> 
+4

あなたの質問や問題は何ですか? –

+0

このエラーは常に表示されます。現在のアイテムがユーザーの選択と一致しないという理由だけで、カート配列をループすると、項目が異なる配列要素に含まれる可能性があるため、見つからなかったわけではありません。なぜこれは初心者プログラマーが得るための難しいコンセプトなのでしょうか?発見されたかどうかを知る前に、配列全体を調べるまで待たなければなりません。 – Barmar

+0

@Barmar:Okですが、条件比較を使用して値が存在することを確認しましたか?私のやり方は正しいのではないですか? –

答えて

1

foreachループが間違っています。ユーザーが選択したものとは異なるIDまたはサイズのカート項目が表示されても、配列の別の要素にある可能性があるため、見つからないことを意味しません。アイテムが見つかったかどうかを知るために、ループの最後まで待つ必要があります。

$found = false; 
foreach ($_SESSION['cart'] as &$key) { 
    // Use &$key reference so we can modify the element 
    if ($key['id'] === $pid and $key['size']=== $size) { 
     $key['quantity']++; 
     echo "YES CORRECT"; 
     $found = true; 
     break; 
    } 
}//end foreach 
if (!$found) { 
    $_SESSION['cart'][] = array('id' => $pid, 'size' => $size, 'quantity' => 1); 
} 

また、あなたが同じ$pidと異なるサイズを有することができるので、あなたは、$_SESSION['cart']のキーとして$pidを使用することはできません、と連想配列は、同じキーを持つ複数の要素を持つことはできません。

+0

私はあなたのコードをテストしましたが、同じIDとサイズがすでにカートに入っていても問題は残っています。量はインクリメントする必要がありますが、コードはその部分をしません。 –

+0

それはすべきです。それは$ key ['quantity'] ++;がします。コメントで説明しているように、 'as $ key'を' as&$ key'に変更するのを覚えましたか? – Barmar

+0

はいそれはうまくいきます。本当にありがとうございます。しかし、私はこの技術が何であるかを知る必要があります。私はそれについて研究したい。 –

-2

$ example_parent_array = array( 'example_1'、 'example_2');

$ example_parent_array ['example_1'] = array( 'child_array_index' => "例");

echo $ example_parent_array ['example_1'] ['child_array_index']; //出力:「例」

+1

ハァッか。これは何ですか? – Barmar

関連する問題