PHPでarray_flatten

beanz (2008年11月26日 13:50) | コメント(0) | トラックバック(0)

PHPには多次元配列をフラットにする関数は用意されていないようだ。
だが、例えばYahoo等で"array_flatten"と検索するといろんなページが引っかかってくる。
Rubyで配列をフラットにするメソッドがflattenで、PHPでは配列に対する関数の多くにarray_という接頭辞が付くのでそんな関数あるかなと思って適当に考えただけなのに。
とはいえ、すでにいたる所で"array_flatten"という名前でその目的の関数が定義されてた。
PHPのマニュアルページにもある。

処理の方法はいろいろとあったが3つほどメモっておく。 それぞれコードは

その1:

function array_flatten($array) {
  $tmp = array();
  while (($val = array_shift($array)) !== null) {
    if (is_array($val)) $array = array_merge($val, $array);
    else $tmp[] = $val;
  }
  return $tmp;
}

その2:

function array_flatten($array){
  $tmp = array();
  if(is_array($array)) foreach($array as $val) $tmp = array_merge($tmp, array_flatten($val));
  else $tmp[] = $array;
  return $tmp;
}

その3:

function array_flatten($array){
  static $tmp;
  if(is_array($array)) foreach($array as $val) array_flatten($val);
  else $tmp[] = $array;
  return $tmp;
}

となる。
どの関数も関数内で一時的な配列を用意して最後にその配列を返すというのは同じだ。
その1は引数としてわたってきた配列の要素を一つずつ抜き出し(array_shift)もし値が配列であればその配列と残りの配列をマージしていくというやり方だ。
その2とその3は関数内で自身を呼び出す再帰を使っているが、その3は配列$tmpをstatic宣言する事で関数内の関数で$tmpが初期化されないようになっている。
どの関数も引数に1つの多次元配列を指定する事でフラット化された配列が戻ってくるようになっている。
例えば

$a = array(
  "RedHat", "Vine",
  array("Slackware", "Plamo"),
  "Debin", array("Turbo", "LASER5",
    array("Momonga", "Ubuntu", "Yellow Dog")
  )
);

こんな配列があったとしてそれをprint_rすると

Array
(
    [0] => RedHat
    [1] => Vine
    [2] => Array
        (
            [0] => Slackware
            [1] => Plamo
        )

    [3] => Debin
    [4] => Array
        (
            [0] => Turbo
            [1] => LASER5
            [2] => Array
                (
                    [0] => Momonga
                    [1] => Ubuntu
                    [2] => Yellow Dog
                )

        )

)

こう出力される。 これを

print_r(array_flatten($a));

こうすると

Array
(
    [0] => RedHat
    [1] => Vine
    [2] => Slackware
    [3] => Plamo
    [4] => Debin
    [5] => Turbo
    [6] => LASER5
    [7] => Momonga
    [8] => Ubuntu
    [9] => Yellow Dog
)

こうなってくる。
ちなみにその1の関数だけは引数は配列じゃないと駄目だ。
残りの二つは文字列や数値を渡してもそれらを包んで(要素数1の)配列として返してくれる。

カテゴリ:

トラックバック(0)

トラックバックURL: http://blog.beanz-net.jp/beanz_mtos/mt-tb.cgi/31

コメントする