前提
背景
事象(やりたいこと)
以下2重配列をデータベースにINSERTしたい
↓配列:$_SESSION['cartinfo']
array(3) { [0] => array(3) { 'isbn' => string(4) "0018" 'title' => string(4) "java" 'price' => string(3) "700" } } array(3) { [1] => array(3) { 'isbn' => string(4) "0019" 'title' => string(7) "android" 'price' => string(3) "500" } } array(3) { [2] => array(3) { 'isbn' => string(4) "0020" 'title' => string(3) "php" 'price' => string(3) "600" } }
困ったこと
- 当初はfor文を使って、以下のようにINSERTしていた
for($i=0; $i > $cartinfoCnt; $i++){ $sql_insert = "INSERT INTO orderinfo VALUES(NULL, '{$userName}', '{$_SESSION['cartinfo'][$i]['isbn']}', {$quantity}, '{$date}')"; $result_insert = executeQuery($sql_insert); }
- ただ、プログラム内で$_SESSION['cartinfo']内のデータを消す機能も実装されていた。
そうなると、例えば添え字が[1]のデータが消した場合、for文では[0]のデータを処理した後、「次のデータ[1]がないよ!」とエラーが吐かれる
試したこと
1, forではなくforeachに変更
- 以下のようにforeachで実装し直した
foreach($_SESSION['cartinfo'] as $key => $val){ $isbn = $val['isbn']; $sql_insert = "INSERT INTO orderinfo VALUES(NULL, '{$userName}', '{$isbn}', {$quantity}, '{$date}')"; $result_insert = executeQuery($sql_insert); }
結果
これで途中の[1]が消えても問題なく[0], [2]...と処理ができるようになった
所感
- 配列であればforeachを使うのが通常だと思う。
では、なぜ私が当初forを使ってしまったのか。
要因は配列にある添え字([0], [1], [2]...)を見て、「数字で順番に回さなきゃいけない!」と直感的におもったため。
- 今回のforeachへの置き換えにより、foreachは「添え字に関係なく上から順にデータがなくなるまで処理を繰り返す」という特性を持っていることを改めて学ぶことができた