• ベストアンサー

配列の値について

度々の質問で恐縮です。長時間かけて試行錯誤するものの一向に解決せず、お知恵をお借りできればと思い投稿させて頂きました。 ---------------- 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】の位置でも全て表示できるようにするにはどうすればよいか、何かアドバイスをぜひともよろしくお願いいたします。 分かりにくくて申し訳ありません。

  • fou
  • お礼率93% (41/44)
  • PHP
  • 回答数3
  • ありがとう数2

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

  • ベストアンサー
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

  • 変数の参照?について

    複数の画像とそのサムネイル(自動作成)を登録(保存)、表示するスクリプトを作っています。 質問は、下記に出現する「$imgname[$i]」「$img_thumb[$i]」の各変数が場所によって参照(反映?)されない問題の解決方法についてです。 1.formを使い、下記のようにして複数の画像ファイルを配列で渡します。 <input type="file" name="img[]" size="100"> 2.そのファイルを受取り、処理する関数は下記のような流れです。 <?php function screen_entconf(){ //保存するディレクトリ define('DIR', 'img/'); //受け取ったファイルをフォルダに振り分け、保存 for ($i = 0; $i <= 2; $i++) { if (is_uploaded_file(@$_FILES["img"]["tmp_name"][$i])) { switch($cateid) { case 1: $imgdir = DIR . "esy/"; break; } $imgname[$i] = basename($_FILES['img']['name'][$i]); $imgfile[$i] = $imgdir . $imgname[$i]; // テンポラリファイルを保存ディレクトリにコピー copy($_FILES["img"]["tmp_name"][$i], $imgfile[$i]); //GDライブラリにてサムネイル作成 <--中略--> //出力先ディレクトリにサムネイルを保存 if (preg_match('/\.jpg$/', $imgname[$i]) > 0) { ImageJpeg($img_out[$i], $imgdir . "s_" . $imgname[$i] ); $img_thumb[$i] = "s_" . $imgname[$i]; } //イメージの開放  【【この位置でechoによる画像&ファイル名表示は可能】】 }  } ?> <form // 確認表示(ファイル名&画像等) ★★↓ここ以降、変数が全く無視され、何も表示されません。★★ <P><?=$imgname[$i]?> <P><?=$img_thumb[$i]?> (…後少し続きますが、補足欄で追記予定) ■何か解決のヒントが頂ければ幸いです。よろしくお願いします。

    • ベストアンサー
    • PHP
  • 配列操作について

    お世話になります。 $obj = array(1 array(id=>111 name=>aaa date=yyyymmdd array(2 array(id=>222 name=>bbb date=yyyymmdd 上記のようなオブジェクト($obj)があるとして この最下層の連想配列データ(id,name,date)を 配列にしたい時は、以下のような書き方で取れると 思いますが、もっとすっきりさせる書き方などありますか? $a = array(); $c = count($obj); for($i=0; $i<$c; $i++){ $a = $obj[$i]['id']; $a = $obj[$i]['name']; $a = $obj[$i]['date']; $i++}

    • ベストアンサー
    • PHP
  • 【PHP】配列の値が上書きされる

    PHP初心者です。 PHPとMYSQLとHTMLでweb画面を作成しています。 ループで、SQLを複数回回し、その結果を配列に格納しようとしているのですが、 配列には毎回最後の一つの結果しか格納されません。 いろいろ調べて、試してみたのですが、どうしても分かりません。 申し訳ありませんが、お分かりの方がいたら、ご教示願えませんでしょうか。 以下にソースを記載します。 ******************************************************** <?php $checkbox = $_REQUEST["chk"]; $pdo = new PDO("mysql:host=localhost; dbname=TESTDB; charset=utf8", "hoge", "hoge", array( PDO::ATTR_EMULATE_PREPARES => false ) ); $results=array(); for($i=0; $i<sizeof($checkbox); $i++){ $sql = "select * from Item where 1 = 1 "; $sql = $sql . " and id=${checkbox[$i]} "; $statement = $pdo->prepare( $sql ); var_dump($sql);   ←★デバッグ用 $statement->execute(); $results = $statement->fetchAll(); } ?> <?php print count(sizeof($checkbox));   ←★デバッグ用 print("<pre>");   ←★デバッグ用 print_r($results);   ←★デバッグ用 print("</pre>");   ←★デバッグ用 ?> ******************************************************** $checkbox = $_REQUEST["chk"]; の部分ですが、前のページでチェックボックスに3箇所チェックを入れて、その情報を格納しています。 var_dump($sql)の結果、 string(41) "select * from Item where 1 = 1 and id=8 " string(41) "select * from Item where 1 = 1 and id=9 " string(42) "select * from Item where 1 = 1 and id=10 " と、ちゃんと3つ認識しています。 しかし、 print("<pre>"); print_r($results); print("</pre>"); の結果が、 Array ( [0] => Array ( [id] => 10 [0] => 10 [item_name] =>商品1 [1] => 商品1 [price] => 10000 [2] => 10000 [rfu1] => [3] => [rfu2] => [4] => [rfu3] => [5] => [memo] => comment [6] => comment ) ) と、最後の1つしか格納されていないのです……。

    • ベストアンサー
    • PHP
  • 区切り文字を配列に格納する方法を教えて下さい。

    区切り文字を配列に格納する方法を教えて下さい。 $array[] = "abc,1981,1,12"; $array[] = "def,1982,2,18"; $array[] = "ghi,1991,4,12"; list($name[$i],$yy[$i],$mm[$i],$dd[$i]) = split("\,",$array[$i]); でループさせればそれぞれの変数に代入できますが、例えば $name["abc"]["yy"] = "1981"; $name["abc"]["mm"] = "1"; $name["abc"]["dd"] = "12"; のように分解するにはどうすれば良いでしょうか?

    • 締切済み
    • PHP
  • 二次元配列のソート PHP

    タイトルのとおりソートを行ってくれる関数を探しております。 $buf[][]の二次元配列の変数を日付の降順に並べ替えたいのですが、そういった関数は用意されていますか? sort()、rsort()では不可能かと思います。 以下、二次元配列の値です。配列三番目の日付の降順で再格納したいです。 ( [0] => Array ( [0] => 1[1] => name1 [2] => 2006-08-18 ) [1] => Array ( [0] => 2 [1] => name2[2] => 2006-08-28 ) [2] => Array ( [0] => 3[1] => name3 [2] => 2006-08-18 ) [3] => Array ( [0] => 4 [1] => name4[2] => 2006-08-18 ) よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • foreachで多次元配列を生成

    こんにちわ。 配列をforeachでループさせて、それを多次元配列に入れていくことは可能でしょ うか? 例えば以下のようなデータがあるとします。 ---meibo.dat-------- c21<>田中<>21<>東京 c22<>佐藤<>22<>大阪 -------------------- ---test.php----------------------------------------------------- <? $list_meibo = file("meibo.dat"); foreach($list_meibo as $temp){    $i=split("<>",$temp);    $a=array($i[0] => array("name"=>$i[1],"age"=>$i[2],"ad"=>$i[3]),); } ?> ------------------------------------------------------------------- これでは $a=array("c21"=>array("name"=>"田中","age"=>"21","ad"=>"東京"), "c22"=>array("name"=>"佐藤",age"=>"21","ad"=>"大阪"),); という具合になってくれないでしょうか? これでいくと、配列の最後の要素のみデータに残ります。 どのようにしたらよいでしょうか? ご教授お願いします。

    • ベストアンサー
    • PHP
  • upload.php内のページ転送について

    header Locationの転送について教えてください。 PHPファイル内で画像プレビューを表示させ ページ転送を行いたいです。 しかし、プレビューが表示される部分に 転送先の<header>(html5)の内容が表示されてしまいます。 どこが悪くてどう直せば良いのでしょうか? どなたか教えてください。 <?php header("Location: http://www.********.com/"); ?> <?php //前にアップロードされた写真のファイル名 $postPhotoName = $_POST["postPhotoName"]; $result = false; if($_FILES['img']['name'] == "") { die("ファイルがないぜよ。"); }else{ //アップロードされたファイルの情報を取得 $fileName = basename(date("U")."-".$_FILES['img']['name']); $fileType = $_FILES['img']['type']; $fileTmpName = $_FILES['img']['tmp_name']; if(!preg_match("/jpeg/",$fileType)){ unlink($fileTmpName); die( "jpegじゃないぜよ。"); }else{ //ファイルの保存 if (!move_uploaded_file($fileTmpName, 'thumbimg/' . $fileName)) { die('保存にしっぱいしたぜよ。'); } else { //サムネイル作成 include('class.image.php'); list($width, $height, $type, $attr) = getimagesize('thumbimg/'.$fileName); $thumb = new Image('thumbimg/'.$fileName); $thumb->name('thumb-'.basename($fileName,".jpg")); if($width>$height){ if($width > 380) $thumb->width(380); }else{ if($height > 400) $thumb->height(400); } $thumb->save(); $result = true; } } } if($result == true){ ?> <img src="<?php echo 'thumbimg/thumb-'.$fileName;?>"> <input type="hidden" value="<?php echo $fileName?>" name="postPhotoName" id="postPhotoName"> <?php }

    • 締切済み
    • PHP
  • 配列の中身をボタンをおすことによって順次表示させたいです

    $files は配列です。 この中に値が格納されております。 この値をNEXTボタンを押すことによって順次表示させていきたいです。 どのようにしたらよいのでしょうか? <?php if($_POST['next']){ echo "<img src=\"img/$files[4]\">"; } ?> <form method="post" action="test.php"> <input type="submit" name="next" value="NEXT" > </form>

    • ベストアンサー
    • PHP
  • 多次元配列がさっぱりです。

    var img = ["test01.jpg", "test02.jpg", "test03.jpg", "test04.jpg"]; var name = ["テスト1", "テスト2", "テスト3", "テスト4"]; for (var i = 0; i < img.length; i ++) { document.write('<img src="../img/' + (img[i]) + '" width="132" height="160" border="0" />' + '<br />'); for (var j = 0; j < name.length; j ++){ document.write((name[j])); } } 全然駄目です・・・ 画像があって、画像の下に var name を表示したいんですが、分かりませんでした。分かるかた、教えてください!

  • 多次元配列を、1次元の配列にする関数を書いてください。

    以下のように、多次元配列の配列をペチャンコにする関数(array_flatten)ってどうかきますか? <?php $arr[0] = 'a'; $arr[1][0] = 'b'; $arr[1][1][0] = 'c'; $arr[1][1][1][0] = 'd'; $arr[1][1][1][1][0] = 'e'; $arr[1][1][1][2] = 'f'; $arr[1][1][2] = 'g'; $arr[1][2] = 'h'; $arr[2] = 'i'; function array_flatten($arg){   処理; } $new_arr = array_flatten($arr); print_r($new_arr); ?> ↓ Array (   [0] => a   [1] => b   [2] => c   [3] => d   [4] => e   [5] => f   [6] => g   [7] => h   [8] => i ) ※関数のなかで、ペチャンコの配列を格納するための新しい配列を宣言すると、 同関数を再帰的に呼び出したら、その配列が初期化されますよね?

    • ベストアンサー
    • PHP

専門家に質問してみよう