dポイントプレゼントキャンペーン実施中!

以下のように、多次元配列の配列をペチャンコにする関数(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
)

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

A 回答 (3件)

function array_flatten($array){


static $result;

if( is_array($array) ){

  foreach($array as $val){
  flat($val);
  }

}else{
$result[]=$array;
}

return $result;
}

これで目的の挙動を得られるかと・・・
ポイントはstatic指定でしょうか?
    • good
    • 0
この回答へのお礼

ありがとうございます確認しました!

static!
私が探していたのは、まさにこれです。

以下のページが参考になりました。
http://php.plus-server.net/language.variables.sc …

PHP歴一ヶ月なので、頑張りま~す。

お礼日時:2007/12/19 02:17

せっかくなので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()なども用意されている
ようです。
    • good
    • 0
この回答へのお礼

ありがとうございます確認しました!
皆さんの回答例、本当に勉強になります。

こちらは、やはり array_walk ですね。
PHP初心者なので、何の宣言もなく
> array_walk($arr,"array_flattent",&$new_arr);
いきなりリファレンスを渡しているところが、なんとも斬新です。
シンプルな回答例ありがとうございました!

あ、今回の件とは関係ないですが、print_r や var_dump が見にくくて困ってました。<pre>タグ使って、出してやればいいのか・・・。
ありがとうございます。

お礼日時:2007/12/19 02:32

いろんなやり方があるでしょうが


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;
}
    • good
    • 0
この回答へのお礼

ありがとうございます確認しました!

> $result = array();
私も、こうやって、再帰的に呼び出した時に、毎回初期化されて困ったな・・・、と思っていたのですが、
> $result = array_merge($result, array_flatten($val));
なるほど。
こうすれば、毎回新しい配列 $result で問題ないってことですね。

ANo.1 と、潜って行き方が根本的に違いますね。
勉強になりました!

お礼日時:2007/12/19 02:25

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!