• 締切済み

多次元配列の扱い方

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//←ここで値を扱いたいけど、配列も含まれてるので・・・ }

みんなの回答

  • 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

専門家に質問してみよう