再帰的に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階層目までしか与えられてないので最後の要素「+
」で結合されている