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

