php array_flattenを実装する

phpは配列を操作する関数が多くあるが多次元配列をフラットにする関数がない。(ということを最近知った)

実装方法は様々あるが、その中からいくつか紹介します。

再帰的に処理をする

1
2
3
4
5
6
7
8
9
10
11
12
13
function array_flatten(array $arr) {
    $ret = array();

    foreach ($arr as $item) {
        if (is_array($item)) {
            $ret = array_merge($ret, array_flatten($item));
        } else {
            $ret[] = $item;
        }
    }

    return $ret;
}

SPLのイテレータクラスを利用する

1
2
3
function array_flatten(array $arr) {
    return iterator_to_array(new RecursiveIteratorIterator(new RecursiveArrayIterator($arr)), false);
}

値に対して何らかの処理を行いたい場合はこちらのほうが良いかも。

1
2
3
4
5
6
7
8
9
10
11
function array_flatten(array $arr) {
    $it = new RecursiveIteratorIterator(new RecursiveArrayIterator($arr));

    $ret = array();

    foreach ($it as $value) {
        $ret[] = $value;
    }

    return $ret;
}

SPLのイテレータクラス初めて知ったけどシンプルに書けてよいね。

参考

Comments