• ベストアンサー

配列の値について

度々の質問で恐縮です。長時間かけて試行錯誤するものの一向に解決せず、お知恵をお借りできればと思い投稿させて頂きました。 ---------------- for ($i = 0; $i <= 2; $i++) { // 3回ループです。 if (is_uploaded_file(@$_FILES["img"]["tmp_name"][$i])) { $pre = "s_"; $imgname[$i] = basename($_FILES['img']['name'][$i]); $imgfile[$i] = $imgdir . $imgname[$i];   << 中略(色々な処理) >> if (preg_match('/\.jpg$/', $imgname[$i]) > 0) { ImageJpeg($img_out[$i], $imgdir.$pre.$imgname[$i] ); $img_thumb = array($i => basename($imgdir.$pre.$imgname[$i]));} 【A】} 【B】} 【C】 ----------------- ■上記『$img_thumb』には配列の値を格納していますが、【A】、【B】の位置で『print_r』を実施したところ、Array ( [0] => ××.jpg ) Array ( [1] => ○○.jpg )Array ( [2] => △△.jpg ) のように配列データが格納されていますが、【C】の位置では、Array ( [2] => △△.jpg ) だけしか表示されません。 これを【C】の位置でも全て表示できるようにするにはどうすればよいか、何かアドバイスをぜひともよろしくお願いいたします。 分かりにくくて申し訳ありません。

質問者が選んだベストアンサー

  • ベストアンサー
noname#49664
noname#49664
回答No.2

$img_thumb = array($i => basename($imgdir.$pre.$imgname[$i]));} 少し勘違いされているところがあるんじゃないでしょうか。 これでは、繰り返しの1回目にArray ( [0] => ××.jpg )、2回目にArray ( [1] => ××.jpg )、3回目にArray ( [2] => ××.jpg )が毎回入れなおされているだけです。つまり、img_thumbには常に1つしかデータが入っていません。ですから、【C】で最後のArray ( [2] => ××.jpg )しかないっていなかったのだろうと思います。 【A】、【B】の位置では、3回の結果が続けて書き出されたので「配列に3つ入っている」と勘違いしたのではないでしょうか。ここでも、配列に入っているのは常に1つだけです。 $img_thumb[$i] = array($i => basename($imgdir.$pre.$imgname[$i]));} たとえばこんな具合にするとか、array_pushを使うとかしてはいかがですか。

fou
質問者

お礼

早々に、且つご丁寧な回答をいただき、大変ありがとうございました。 お礼が遅れてしまい申し訳ありません。 >つまり、img_thumbには常に1つしかデータが入っていません。ですから、【C】で最後のArray ( [2] => ××.jpg )しかないっていなかったのだろうと思います。 ↑の部分、深く納得いたしました。ありがとうございます。 いろいろ試行している中で、どのパターンかのときに Array ( [0] => ××.jpg )、Array ( [0] => ○○.jpg )、Array ( [0] => △△.jpg ) と全て同じキーで表示されたことがあり、なぜそうなったのか原因が全く分かりませんでした。しかし、こういう理由だったということが分かり、大変感謝しております。ありがとうございます。 また、ご提示頂いた式で試した結果、残念にも期待する結果が得られず、引き続き苦戦を強いられております。詳しくは補足で記載させて頂きたいと思いますので、もしよろしければ、また何かアドバイスを頂ければ大変有り難く存じます。 どうぞよろしくお願いいたします。

fou
質問者

補足

$img_thumb = array($i => basename($imgdir.$pre.$imgname[$i]));} を $img_thumb[$i] = array($i => basename($imgdir.$pre.$imgname[$i]));} に変更し、【C】の位置で3パターンの表示を試してみた結果が下記のようになりました。 1.print_r($img_thumb[$i]); echo "<br />";    → A      A      A  // 「A」が三つ表示されます。 2.print_r($img_thumb); echo "<br />";     →  A_adog2.jpg        AAadog2.jpg        AAAdog2.jpg // 解析不能なファイル名が三つ表示されます。 3.echo $img_thumb[0]; echo "<br />"; echo $img_thumb[1]; echo "<br />"; echo $img_thumb[2]; echo "<br />";    → A      A      A  // 「A」が三つ表示されます。1のケースと同様。 ちなみに、 ・print_r($imgname); →Array ( [0] => ××.jpg [1] => ○○.jpg [2] => △△.jpg ) ・print_r($imgname[$i]); → 無表示 ・ echo $imgname[0]; echo "<br />"; echo $imgname[1]; echo "<br />"; echo $imgname[2]; echo "<br />"; → ××.jpg   ○○.jpg   △△.jpg  // ◎期待通りの結果。 のような結果になります。 「$imgname[$i]」と「$img_thumb[$i]」ではそんなに何かが違うのでしょうか…。自分の頭ではかなり行き詰まった状態です。 もしよろしければ、何かお知恵を拝借できますと、大変有り難く存じます。どんな些細なことでも結構ですので、どうぞよろしくお願いいたします。

その他の回答 (2)

  • subfou
  • ベストアンサー率0% (0/1)
回答No.3

自己解決したため、そのご報告とお礼のため、自己回答いたします。 結論は『変数名がカブって(重複して)いた』ことが原因でした。 試行を繰り返す中、質問した処理部分のみに起こる現象(値を渡すformのコードを簡素にし、処理方法は同じコードで試した場合、正常に配列として値を格納できている)ということに気付き、最初からコードを見直した結果、値を渡すformのname属性の中に元々「img_thumb」があり、それをextract($_POST);で変数化していたので、元々『$img_thumb』には値が入っていたことになり、おかしな挙動の原因になっていたようです。 ★『$img_thumb[$i]』 → 『$image_thumb[$i]』 に変更すると、見事に解決いたしました。 模索する方向のヒントを与えて頂き、ご回答頂いたお二方には本当に感謝いたします。 どうもありがとうございました。

  • asahina02
  • ベストアンサー率47% (95/202)
回答No.1

$img_thumb に格納している行ですが、 $xx = array( xx ); これは配列を初期化していますですよ。 なのでこの部分を $img_thumb[ $i ] = basename($imgdir.$pre.$imgname[$i]); なんかにしてあげればいいんではなかろうか。

fou
質問者

お礼

早々にご回答を頂きありがとうございました。 仕事の都合でお礼が遅れてしまい申し訳ありません。 アドバイスいただいた式で試してみたのですが(質問投稿前にも試したことがあり、やはり同じ結果だったと記憶しています。いろいろやり過ぎて記憶が曖昧なのですが…)、期待する結果が得られず、引き続き格闘しています。 詳しくは補足部分で記載させていただきます。 ひとまず、早々のアドバイスをありがとうございました。

fou
質問者

補足

$img_thumb = array($i => basename($imgdir.$pre.$imgname[$i]));} の部分を $img_thumb[ $i ] = basename($imgdir.$pre.$imgname[$i]); に変更し、【C】の箇所で3パターンの表示を試したときの結果がこれらです。 1.print_r($img_thumb[$i]);   → 「d」 //の一文字のみ表示。(なぜか「d」です) 2.print_r($img_thumb);   → 「sss○○.jpg」 //$preの「s」が3つ付加されたファイル名一つのみ表示。 3.echo $img_thumb[0]; echo "<br />"; echo $img_thumb[1]; echo "<br />"; echo $img_thumb[2];   → s     s     s   // $preの「s」だけが3つ表示されます。 とこのようなおかしな挙動?をするのです。 何か文字に関する処理をしてあげなければ、変な表示になるのでしょうか…。 ちなみに、$imgname[0]、$imgname[1]、$imgname[2]を【C】の位置でecho表示すると、期待通り各々のファイル名が表示されます。 サムネイル($img_thumb)だけがおかしな状態です。 もしよろしければ、引き続き何かアドバイスを頂けますと、大変有り難く存じます。どうぞよろしくお願いいたします。

関連するQ&A

専門家に質問してみよう