PHP 配列の初期化

2010/09/13

時間がかかった原因は中途半端に結果を出力したため。

CSV-カテゴリ($C_data)
A.html
B.html

CSV-詳細($l_data)
A.html,aaaa
B.html,bbbb
A.html,cccc
A.html,dddd
B.html,eeee

上記のようなのがあって下記のようにしたい。

A.html:「aaaa」「cccc」「dddd」
B.html:「bbbb」「eeee」

最初は下記のようにしてた。

  1. $Phtml = array();
  2. foreach ($C_data as $val) {
  3.  list($C_url,~) = explode(~);
  4.  $pNum=0;
  5.  foreach ($l_data as $val) {
  6.   list($l_url,$l_Con) = explode(~);
  7.   if ($l_url != $C_url) {continue;}
  8.   $Phtml[$pNum]=$l_Con;
  9.   $pNum++;
  10.  }
  11.  echo = $Phtml[$pNum].”\n”;
  12. }

結果は下記。

A.html:「dddd」
B.html:「dddd」

原因は配列の初期化をループの中でやっていないので大変なことに。

1行目で配列の初期化($Phtml = array();)

2行目の1週目

「$C_data」の一つ目「A.html」のときに
8行目んトコで「$Phtml[0]=aaaa、$Phtml[1]=cccc、$Phtml[2]=ddddd」と代入していく。

5行目のループが終われば2行目に戻る

2行目の2週目

「$C_data」の二つ目「B.html」のときに
8行目んトコで$Phtmlを上書きしていく。

つまり、「$Phtml[0]=bbbb、$Phtml[1]=eeee」となる。
「$Phtml[2]」は何もしていないので最初のループに代入された状態の「$Phtml[2]=ddddd」となる。

対応

2行目のforeach()の後に配列の初期化が必要なので2行目と5行目のforeach()の間に移す

ということで修正したのが下記。

  1. foreach ($C_data as $val) {
  2.  list($C_url,~) = explode(~);
  3.  $Phtml = array();
  4.  $pNum=0;
  5.  foreach ($l_data as $val) {
  6.   list($l_url,$l_Con) = explode(~);
  7.   if ($l_url != $C_url) {continue;}
  8.   $Phtml[$pNum]=$l_Con;
  9.   $pNum++;
  10.  }
  11.  echo = $Phtml[$pNum].”\n”;
  12. }

11行目のとこで配列の$Phtmlの全部を出力しておけばもう少し早く間違いに気づいたはず…。

新着(ニュース関連以外)

2018-07-26
年賀状で「新春」とか書くけど・・・何故なんだろうと8月を目前にした今、疑問に思った。
2018-05-16
PHPで画像のヘッダ情報(?)の「Orientation」を元に画像回転させたい。
2018-03-05
Android Studioをインストール。エミュレータを軽くするトコまで終わらせたかったけど、挫折した。
2018-02-23
プッシュ通知について調べてた時にでてきたServiceWorker。そのServiceWorkerについてのメモ。
2017-12-13
jqueryで取得したDOM要素をオブジェクトじゃなくて、配列で受け取りたい