※重要!cart_look.phpにおいて$cartと$kazuはペアになっている。

		
  • $cart = array(0 => '12', 1 => '45', 2 => '32', 3 => '55', 4 => '67',....); // 商品コードの配列
  • $kazu = array(0 => '1', 1 => '1', 2 => '1', 3 => '1', 4 => '1',....); // 購入数の配列

配列要素の順

配列要素の順番は「カートに入れた順」。

インデックス番号が同じものは、同じ商品についての情報となる。
$cart[4]と$kazu[4]は、「商品コード67の商品を1個」という意味になる。

つまり、n番目にカートに入れた商品について、商品情報と個数情報をまとめて扱える。

$cartと$kazuの配列要素の数はカートに入れる度に配列に追加されていくので、
その要素の数ループを回せば一気に取り出せる。

では、その他の情報(DBに入っているname・price・images)はどうするか?

$cart(商品コード)と$kazu(購入数)はカートに入れた順番になっているが、
DBに入っているname、price、imagesは、code(商品コード)を1個入れて1個取り出せるだけ。
それを「カートに入れた順」を維持して表示したい。

foreach($cart as $key => $value){}のループ内では、
$cartに入った商品コードを1つずつDBにリクエストし、
$recにname、price、imagesを受け取っている。

		

$rec = $stmt->fetch(PDO::FETCH_ASSOC);

$recには次のようにDBから受け取った値が「カートに入れた順」に多次元配列となって入っている。

		
  • $rec = array(
  •      0=> array(code=> '15', name=> '愛犬元気', price=> '1500', images=> 'abc.jpg'), // 1番目にいれた商品コード
  •      1=> array(code=> '24', name=> 'ビスカル', price=> '2000', images=> 'def.jpg'), // 2番目にいれた商品コード
  •      2=> array(code=> '67', name=> 'アイムス', price=> '4500', images=> 'ghi.jpg'), // 3番目にいれた商品コード
  •      3=> array(code=> '11', name=> 'ビタミン', price=> '1000', images=> 'osj.jpg'), // 4番目にいれた商品コード
  •      4=> array(code=> 'n', name=> 'ビスカル', price=> '2000', images=> 'def.jpg'), // n番目にいれた商品コード
  •      ....
  • );

name・price・imagesを取り出したい場合、それぞれ...

		
  • $product_name = $rec['name'];
  • $product_price = $rec['price'];
  • $product_image = $rec['images'];

で良いはず。しかしこれでは 最後にカートに入れた商品しか取り出せず、「カートに入れた順」が反映されない。
「カートに入れた順」にするためには、

		
  • $product_name[] = $rec['name'];
  • $product_price[] = $rec['price'];
  • $product_image []= $rec['images'];

と変数名に[]をつけて配列として格納する。

		

$product_name = array(0 => '愛犬元気', 1 => 'ビスカル', 2 => 'アイムス', 3 => 'ビタミン',...);

$product_name[0]はアイムス、$product_name[1]は愛犬元気と表現できる。
この配列要素の順番は$cart、$kazuと対応して「カートに入れた順」である。

		
  • $cart = array(0 => '12', 1 => '45', 2 => '32', 3 => '55', 4 => '67',....); 商品コードの配列
  • $kazu = array(0 => '1', 1 => '1', 2 => '1', 3 => '1', 4 => '1',....); 購入数の配列
  • $product_name = array(0 => '愛犬元気', 1 => 'ビスカル', 2 => 'アイムス', 3 => 'ビタミン',...); 商品名の配列

$cart[4]と$kazu[4]と$product_name[4]なら、「商品コード67の商品を1個、商品名...」というなる。
n番目にカートに入れた商品についての情報がまとめて扱える。

$cart、$kazu、$product_name、$product_price、$product_imageの 要素数は全て同じで、全て「カートに入れた順」に並んでいる。

要素数を数えて、「カートに入れた順」にループを回せば...

		

$max = count($cart); // 要素の数


		
  • for($i = 0; $i < $max; $i++){
  •       echo $product_name[i]; // i番目にカートにいれた商品名A
  •       echo $product_price[i]; // i番目にカートにいれたAの価格
  •       echo $product_image[i]; // i番目にカートにいれたAの画像
  •       echo $kazu[i]; // i番目にカートにいれたAの購入数
  • }

カートに入れた順に表示できる。

カートに入れた順に、i番目のname、i番目のprice、i番目のimages、i番目の数量
次のページでpostで受け取るために、name属性に名前をつける。name="'kazu'.$i"、name="'delete'.$i"

	
  • <?php
  • for($i = 0; $i < $max; $i++){
  •       echo '商品名:'.$product_name[$i].'<br />'; // $product_name[$i]は配列要素i番目のname
  •       echo '価格:'.$product_price[$i].'円<br />'; // $product_price[$i]は配列要素i番目のprice
  •       echo '<img src="../product/images/'.$product_image[$i].'" /><br />'; // $product_image[$i]は配列要素i番目のimage
  •       $kazu = array(1, 1, 1, 1, 1,......); 何番目の要素でも値は1
  • }
  • ?>
  • <?php for($i = 0; $i < $max; $i++): ?>
  •       <?php echo '<p>商品名:'.$product_name[$i].'<br />'; ?>
  •       <?php echo '価格:'.$product_price[$i].'円<br />'; ?>
  •       <?php echo '<img src="../product/images/'.$product_image[$i].'" /></p>'; ?>
  •       <?php echo '<p>数量:'; ?>
  •       <input type="text" name="kazu<?php echo $i; ?>" value="<?php echo $kazu[$i]; ?>" style="width: 30px;">個</p>
  •       <?php echo '<p>小計:'.$product_price[$i]*$kazu[$i].'円</p>'; ?>
  •       <p><input type="checkbox" name="delete<?php echo $i; ?>">商品を削除する</p>
  • <?php endfor; ?>

比較として、product_detail.phpでは、 商品コードを1つだけ渡すのでDBから取り出した$recの中身は、

		

$rec = array(name => 'アイムス', price => '4500', images => 'iams.jpg');

と通常の連想配列となっている。
だから、
$product_name = $rec['name'];

変数を配列にする必要はない。

ページをまたいで値を受け渡ししているのは、商品コード(code)と購入数量($kazu)のみ。
商品名・価格・画像は各ページで個別にSQLによってDBから受け取っている。