クマのブログ

つまづいたところ、学びを書いていきます

【PHP】for文を使った配列の処理

前提

背景

  • 会社の研修中、PHPの基礎講座を受講

  • 今の会社に就職前に独学でPHPを学習していたが、初めて知ったことがあったので、アウトプット

事象(やりたいこと)

以下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は「添え字に関係なく上から順にデータがなくなるまで処理を繰り返す」という特性を持っていることを改めて学ぶことができた