再帰的にimplode
配列の各要素をつなげて文字列にするimplode()は、一次配列にしか使えない。配列内に配列があると「Array」というオブジェクト名になり、情報が失われる。
1 2 3 4 5 6 |
echo implode(',', ['a', 'b', 'c']);// => a,b,cecho implode(',', ['a', ['b', 'c']]);// (Notice: Array to string conversion が出た上で)// => a,Array |
再帰的にimplodeを行ってくれる直接的な関数は無いみたいなので、各自で実装するしか無い。
glue文字が階層によらず一定なら、こちらが参考になる。
今回は、階層の深さによってglue文字を変えたかった。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
/** * 配列内の要素を再帰的に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階層目までしか与えられてないので最後の要素「+」で結合されている

