• 締切済み

多次元配列の扱い方

PHPバージョン5.2.4を使っています。 次のような文字列が入っている多次元配列を foreachなどのループを使ってその値を取り出して扱いたいのですが、 取り出した値には配列(二次元以降の値)も含まれてるので 簡単には取り扱いできません・・・ print_rやvar_dumpを使えば値は全て表示されるのですが、 あくまで表示ではなくて値を取り扱いたいのです。 そのようなことができる関数などはあるのでしょうか? $arr[0][0] = 'a'; $arr[0][1] = 'b'; $arr[1] = 'c'; $arr[2][0][0][0] = 'd'; $arr[2][0][0][1] = 'e'; foreach ($arr as $value) { $value//←ここで値を扱いたいけど、配列も含まれてるので・・・ }

  • PHP
  • 回答数3
  • ありがとう数3

みんなの回答

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.3

参照渡しすればよいでしょう。 <? $arr['k0']['kk0'] = 'a'; $arr['k0']['kk1'] = 'b'; $arr['k1'] = 'c'; $arr['k2']['kk0']['kkk0']['kkkk0'] = 'd'; $arr['k2']['kk0']['kkk0']['kkkk1'] = 'e'; $new_arr=Array(); array_walk($arr, 'set_array',&$new_arr); print_r($new_arr); function set_array($item, $key,$new_arr){ if(is_array($item)) array_walk($item,'set_array',&$new_arr); else $new_arr[] = $item; } ?>

takagoo100
質問者

お礼

ご返答ありがとうございます。 なるほど、array_walkでも参照で渡せばできますね。ありがとうございます。

回答No.2

単純に末端にある文字列だけを取得したいのであれば、以下はいかがでしょうか? $arr['k0']['kk0'] = 'a'; $arr['k0']['kk1'] = 'b'; $arr['k1'] = 'c'; $arr['k2']['kk0']['kkk0']['kkkk0'] = 'd'; $arr['k2']['kk0']['kkk0']['kkkk1'] = 'e'; $return = array(); getString($arr, $return); print_r($return); function getString($arr, &$r) { foreach($arr as $k => $v) { if(is_array($v)) { getString($v, $r); } else { $r[] = $v; } } }

takagoo100
質問者

お礼

ご返答ありがとうございます。 なるほど、参照で渡してあげればいいってことですね。ありがとうございます。 本来ならここで締め切って別の質問を立てるべきなんでしょうが、 どうせ自分で考えても分からないと思うので、 申し訳ないのですがもしよろしければ http://userguide.cilab.info/helpers/directory_helper.html のdirectory_mapで、キーを含めて取得する方法を考えてもらえないでしょうか? 次のように$arr['k0']['kk0'] = 'a';ならk0_kk0_aと取得したいです。 $arr['k0']['kk0'] = 'a'; // k0_kk0_a $arr['k0']['kk1'] = 'b'; // k0_kk1_b $arr['k1'] = 'c'; // k1_c $arr['k2']['kk0']['kkk0']['kkkk0'] = 'd'; // k2_kk0_kkk0_kkkk0_d $arr['k2']['kk0']['kkk0']['kkkk1'] = 'e'; // k2_kk0_kkk0_kkkk1_e

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

とりあえずarray_walkしてみては? <? $arr[0][0] = 'a'; $arr[0][1] = 'b'; $arr[1] = 'c'; $arr[2][0][0][0] = 'd'; $arr[2][0][0][1] = 'e'; array_walk($arr, 'test_print'); function test_print($item, $key){ if(is_array($item)) array_walk($item,'test_print'); else print $item; } ?>

takagoo100
質問者

お礼

ご返答ありがとうございます。 なるほど、その中で処理をすればできそうですね。 ただできれば1次元に纏められた配列を取り出して 外で使いたいと思い、 $arr['k0']['kk0'] = 'a'; $arr['k0']['kk1'] = 'b'; $arr['k1'] = 'c'; $arr['k2']['kk0']['kkk0']['kkkk0'] = 'd'; $arr['k2']['kk0']['kkk0']['kkkk1'] = 'e'; $new_arr = array(); array_walk($arr, 'test_print'); foreach ($new_arr as $value) { //ここで$valueを使う } function test_print($item, $key) { global $new_arr; if(is_array($item)) array_walk($item,'test_print'); else $new_arr[] = $item; } としたのですが、なんか気持ち悪いのでglobalを使わずにできないものでしょうか? というのも、directory_map function directory_map($source_dir, $top_level_only = FALSE) { if ($fp = @opendir($source_dir)) { $filedata = array(); while (FALSE !== ($file = readdir($fp))) { if (@is_dir($source_dir.$file) && substr($file, 0, 1) != '.' AND $top_level_only == FALSE) { $temp_array = array(); $temp_array = directory_map($source_dir.$file."/"); $filedata[$file] = $temp_array; } elseif (substr($file, 0, 1) != ".") { $filedata[] = $file; } } return $filedata; } } という関数で、これは階層構造になったディレクトリを取得し フォルダ名が配列の添え字になるのですが、 http://userguide.cilab.info/helpers/directory_helper.html ただ上のページを参考にするかぎり、print_r()などで表示はできても これをどうやって使う(foreachなどで)のかが分からないのです・・・ 1次元に纏めてforeachなどで使えたら便利そうなのですが・・・

関連するQ&A

  • 多次元配列の計算方法について

    PHP習い始めたばかりで困っているので教えてください。。 多次元配列の要素ごとの計算ループが分からないです。 前提:多次元配列$tajiには15個の要素があり、それぞれに0か1が大量に入っています(具体的には、チェックボックスの回答に因っていて、回答される度に0か1がDBを経由して増えていく感じです) $taji[$rone][] = $row[$rone]; //var_dumpで確認したところちゃんと多次元配列として各要素に値が入っていました。 foreach($taji as $val1){ foreach($val1 as $val2){ print array_sum($val2); }; } …だとエラーになってしまいます。。 希望としては、要素ごとに合計を計算して表示してほしいのですが、 array_sumは多次元配列を無視してしまうのでしょうか?? 全く分からず困っているので、どなたかご教授よろしくおねがいします。

    • ベストアンサー
    • PHP
  • 多次元配列で、foreachを使って、key値を

    多次元配列で、foreachを使って、key値を入れ替えているのですが、 なんで、こうなるか分かりません。  $x = array();  $x[] = array(   "id" => 1,   "name" => "JavaScript",  );  $x[] = array(   "id" => 5,   "name" => "PHP",  );  $z = array();  foreach($x as $key => $value){   $z[$value["id"]] = $value;   }  print_r($z); 配列のKEYをIDに変更しているのですが、 なんで、こうなるのでしょうか? 特に、  $z[$value["id"]] = $value; が分かりません。 例えば、foerachの途中で、var_dumpすると、 1回目だと、 ◆$key 0 ◆$value Array (  [id] => 1  [name] => JavaScript ) ◆$value["id"] 1 まではいいのですが、 ◆$z[$value["id"]] の値が見れません。 ここはどんな処理をやっているのでしょうか?

    • ベストアンサー
    • PHP
  • 多次元配列を、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
  • PHPの多次元配列について

    HTMLでホームページを作れる以外はプログラムに関しほぼ素人です。 環境 XAMPP1.70(最新)にてアパッチなど一括ダウンロード PHP言語にて3×4の表で以下の数値を多次元配列にて作成しようと思っているのですが、当方初心者なもので、 以下のコード(細かい部分は省略しています)、特にforeachがネストになっている部分の処理の流れがいまいちよくわかりません ~~~~~~~~~~~~~~~~~~~~~~~~~ <table border=2> <th>都市名</th> <th>最高気温</th> <th>最低気温</th> <?php  $data=array( array("東京"32,25) array("名古屋",45,67) array("埼玉",32,67) array("大阪",86,34) ) foreach($data as $city){ print "<tr>"; foreach($city as $value){ print "<td>{$value}</td>"    ●1回目foreachからここまでの流れがいまいち分かりません } print "</tr>"; ?> ~~~~~~~~~~~~~~~~~~~~ 一つ目のforeachにて、配列$dataが指定されていますので外側の配列を処理していくと思うのですが、具体的にどういう順番で処理されていくのでしょうか。 またforeach()の中の"$cityが最終的に$valueに格納という形になっていますが、10~13行目のarray("東京",32,25)とどのような関係で処理されていっているのか教えていただけませんでしょうか。 よろしくお願いいたします。

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

    phpとDBでシステムを作っています DBをよみながら配列と比較しています。 ループ中の配列で2回目以降がどうしても配列の値が入りません $Baitai[$cnt]で1回目は配列の値が来るのですが 2回目以降が一部の文字bしか入りません ご教授お願いします。 while($arr_record = mysql_fetch_assoc($rs)) { foreach($arr_record as $field_name => $field_value) {            if($field_value<>"") { echo $Baitai[$cnt]; $Baitai="Baitai".$k; if($Baitai[$cnt]==$field_value) { ?>       <input type="checkbox" value="<?php echo $field_value;?>" Name="<?php echo $Baitai;?>" checked><?php echo $field_value;?> <?php } else { ?> <input type="checkbox" value="<?php echo $field_value;?>" Name="<?php echo $Baitai; ?>"><?php echo $field_value;?> <?php } } $cnt=$cnt+1;             $k=$k+1; } }

    • ベストアンサー
    • PHP
  • 配列の要素の値をループ中に変更して確認したいのですが、下記やり方では、

    配列の要素の値をループ中に変更して確認したいのですが、下記やり方では、なぜダメなのでしょうか? $arr = array("値1", "キー1" => "値2", "値3"); foreach($arr as $key => $val){ $arr[$key] = "-{$val}-"; echo $val."<br />"; } foreach($arr as $key => $val){ echo "<br />".$val; } 上のforeachの結果が、下と同じようになると期待したのですが、うまくいきません。 なんで、上のforeachと下のforeachの結果が異なるのでしょうか? foreach文で要素の値が更新されるのは、foreach文が終了した瞬間なのでしょうか。 それとも、値はすぐに更新されているけれども、foreach文の処理(順番に抽出する作業?)は既にスタートしてしまっているので、ループ中に更新されても、途中で反映することはできない、ということなのでしょうか? さっぱり分からないので、誰か教えてください。 「配列の要素の値をループ中に変更して確認したい」というよりは、 「なんで、二つのforeach文で結果が異なるか知りたい」です。

    • ベストアンサー
    • PHP
  • 二次元配列のforeachはどうすれば?

    <form action="form_check.php" method="POST"> <input type="checkbox" name="check[]" value="aaaa"> <input type="checkbox" name="check[]" value="bbbb"> <input type="checkbox" name="check[]" value="cccc"> <input type="submit" value="送信"> </form> フォームでこのように送りました このデータを受け取り、1つにまとめたいのですが foreach($_POST[check] as $val){ if($all){ $all .= ",".$val; }else{ $all = $val; } } このようにしてみたところ Warning: Invalid argument supplied for foreach() とエラーが出ました。 二次元配列でforeachのループをかけるときはどのように記述すればいいのでしょうか。

    • ベストアンサー
    • PHP
  • 2次元配列をスマーティーにうけわたしたい。

    2次元配列を下記のようなソースで処理し、GETで取得したパラメーターと同じならば、スマーティーをつかって、検索フォームに値をわたしたい(次のページにいった時にフォームのチェックボタンなどをチェックしたいとかんがえています。(foreachはつかわないで)単体と複合の配列は、ラジオボタン、一戸建てと大規模のほうはチェックボックスにしたいと考えてます。 現在は、値が表示されない状態です。どうしたらよいでしょうか? //------------検索画面にひとつのパラメーターをわたす機能 $flagbreak=0; foreach($arr_parame as $row){ $i=1; foreach($row as $id => $list){ if( $id2 == $list['url'] ){ //$id2はGETで取得した値 $check_flag = $list['url']; $parame[$id][$check_flag] = '変数に渡す値を記入'; $flagbreak=1; break; } } if($flagbreak == 1)break; } $smarty -> assign("paramelist" , $parame); //smartyのしょり tplでは、{$paramelist.id.url}と書いてます。 ///////////////////////////////////////////////////////// 2次元配列 $arr_parame = array( array( array('no' => 1 , 'url' => 'un', 'title' => '単体'), array('no' => 2 , 'url' => 'com', 'title' => '複合')), array( array('no' => 1 , 'url' => 'ko', 'title' => '一戸建て'), array('no' => 2 , 'url' => 'man', 'title' => '大規模住宅'));

    • 締切済み
    • PHP
  • php&html printで二次元配列が表示できない

    <html><body> <?php $array1[]= array(); //二次元配列作成 $array1[0][0] = 123; print "$array1[0][0]"; ?> </body></html> というプログラムを作成してみたのですが、printの中身がhtmlでは”一次元配列$array1[0]”と”文字列[0]”という風に読み取られているようで、 表示が Array[0] となってしまいます。 どうにか二次元配列の値を表示する方法はありませんか?

    • ベストアンサー
    • PHP
  • perlでの三次元配列の作り方

    perlで三次元配列をテキスト入力から作りたいのですが、例えば二次元配列の場合 foreach $line (@input) push @data, [split /[:]/, $line]; で@dataが二次元配列になるのですが、三次元配列の場合このあとに push @output, \@data; とするとリファレンスが同じであるためループをまわしてもうまく三次元になりませんよね。 解決法はありますでしょうか?

専門家に質問してみよう