再帰的にimplode

配列の各要素をつなげて文字列にするimplode()は、一次配列にしか使えない。配列内に配列があると「Array」というオブジェクト名になり、情報が失われる。

echo implode(',', ['a', 'b', 'c']);
// => a,b,c

echo implode(',', ['a', ['b', 'c']]);
// (Notice: Array to string conversion が出た上で)
// => a,Array

再帰的にimplodeを行ってくれる直接的な関数は無いみたいなので、各自で実装するしか無い。

glue文字が階層によらず一定なら、こちらが参考になる。

今回は、階層の深さによってglue文字を変えたかった。

/**
 * 配列内の要素を再帰的にimplode
 * @param string[] $glues 結合文字を配列で指定。
 *                        $depth階層目の要素の結合に$glues[$depth]の文字が使われる
 *                        階層がオーバーしたら最後の要素が使われる
 * @param array $array 結合したい文字列
 * @param int $depth 深度 (0-index)
 * @return string
 */
function implodeRecursive($glues, $array, $depth = 0)
{
    return implode(isset($glues[$depth]) ? $glues[$depth] : end($glues),
        array_map(function ($item) use ($glues, $depth) {
            return is_array($item)
                ? implodeRecursive($glues, $item, $depth + 1)
                : $item;
        }, $array));
}


// 使用例
echo $implodeRecursive([',', '|', '-', '+'], [
    'aaa',
    'bbb' => 'ccc',
    'ddd' => 'eee',
    [
        'fff',
        'ggg',
        [
            [
                'hhh',
                'iii',
            ],
            [
                'jjj',
                'kkk',
            ],
            [
                'lll',
                [
                    [
                        'mmm',
                        'nnn',
                    ],
                ],
            ],
        ],
        'ooo',
    ],
    'ppp',
    [
        'qqq',
        'rrr',
    ],
]);

// 結果
// aaa,ccc,eee,fff|ggg|hhh+iii-jjj+kkk-lll+mmm+nnn|ooo,ppp,qqq|rrr
  • キーは出力に含まれない
  • 1階層目は「,」 2階層目は「|」 3階層目「-」 4階層目以降は「+」で結合される
  • mmm, nnnは5階層目にあるが、$gluesが4階層目までしか与えられてないので最後の要素「+」で結合されている
programming/php/string_operation/implode_recursive.txt · 最終更新: 2016/08/01 by ikatakos
CC Attribution 4.0 International
Driven by DokuWiki Recent changes RSS feed Valid CSS Valid XHTML 1.0