再帰的にimplode
配列の各要素をつなげて文字列にするimplode()
は、一次配列にしか使えない。配列内に配列があると「Array」というオブジェクト名になり、情報が失われる。
1 2 3 4 5 6 |
echo implode( ',' , [ 'a' , 'b' , 'c' ]); // => a,b,c echo 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階層目までしか与えられてないので最後の要素「+
」で結合されている