PHP 配列の初期化
2010/09/13
時間がかかった原因は中途半端に結果を出力したため。
CSV-カテゴリ($C_data)
A.html
B.html
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」
B.html:「bbbb」「eeee」
最初は下記のようにしてた。
- $Phtml = array();
- foreach ($C_data as $val) {
- list($C_url,~) = explode(~);
- $pNum=0;
- foreach ($l_data as $val) {
- list($l_url,$l_Con) = explode(~);
- if ($l_url != $C_url) {continue;}
- $Phtml[$pNum]=$l_Con;
- $pNum++;
- }
- echo = $Phtml[$pNum].”\n”;
- }
結果は下記。
A.html:「dddd」
B.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()の間に移す
ということで修正したのが下記。
- foreach ($C_data as $val) {
- list($C_url,~) = explode(~);
- $Phtml = array();
- $pNum=0;
- foreach ($l_data as $val) {
- list($l_url,$l_Con) = explode(~);
- if ($l_url != $C_url) {continue;}
- $Phtml[$pNum]=$l_Con;
- $pNum++;
- }
- echo = $Phtml[$pNum].”\n”;
- }
11行目のとこで配列の$Phtmlの全部を出力しておけばもう少し早く間違いに気づいたはず…。