• ベストアンサー

多次元配列を、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 ) ※関数のなかで、ペチャンコの配列を格納するための新しい配列を宣言すると、 同関数を再帰的に呼び出したら、その配列が初期化されますよね?

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

  • ベストアンサー
  • widoww
  • ベストアンサー率20% (33/159)
回答No.1

function array_flatten($array){ static $result; if( is_array($array) ){   foreach($array as $val){   flat($val);   } }else{ $result[]=$array; } return $result; } これで目的の挙動を得られるかと・・・ ポイントはstatic指定でしょうか?

sweepea
質問者

お礼

ありがとうございます確認しました! static! 私が探していたのは、まさにこれです。 以下のページが参考になりました。 http://php.plus-server.net/language.variables.scope.html#language.variables.scope.static PHP歴一ヶ月なので、頑張りま~す。

その他の回答 (2)

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

せっかくなのでarray_walkをつかって・・・ <?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_flattent($item,$key,$ret){ if(is_array($item)) array_walk($item,"array_flattent",&$ret); else $ret[]=$item; } array_walk($arr,"array_flattent",&$new_arr); print "<pre>"; print_r($new_arr); print "</pre>"; ?> PHP5からは再帰的なarray_walk_recursive()なども用意されている ようです。

sweepea
質問者

お礼

ありがとうございます確認しました! 皆さんの回答例、本当に勉強になります。 こちらは、やはり array_walk ですね。 PHP初心者なので、何の宣言もなく > array_walk($arr,"array_flattent",&$new_arr); いきなりリファレンスを渡しているところが、なんとも斬新です。 シンプルな回答例ありがとうございました! あ、今回の件とは関係ないですが、print_r や var_dump が見にくくて困ってました。<pre>タグ使って、出してやればいいのか・・・。 ありがとうございます。

  • php504
  • ベストアンサー率42% (926/2160)
回答No.2

いろんなやり方があるでしょうが function array_flatten($array){ $result = array(); foreach($array as $val){ if( is_array($val) ){ $result = array_merge($result, array_flatten($val)); }else{ $result[]=$val; } } return $result; }

sweepea
質問者

お礼

ありがとうございます確認しました! > $result = array(); 私も、こうやって、再帰的に呼び出した時に、毎回初期化されて困ったな・・・、と思っていたのですが、 > $result = array_merge($result, array_flatten($val)); なるほど。 こうすれば、毎回新しい配列 $result で問題ないってことですね。 ANo.1 と、潜って行き方が根本的に違いますね。 勉強になりました!

関連するQ&A