はじめに
ある日こんなことを思いました。
2次元配列をimplodeしたい!
と。
どういうことか
[[1,2,3],[4,5,6]]
こんな多次元配列を
1|2|3|4|5|6
こんな感じに変換したいということです。
試したこと① foreach
まずはシンプルにforeachを使って変換しました。
$array = [[1,2,3],[4,5,6]];
$result = "";
foreach($array as $value){
$result .= implode("|",$value);
}
echo($result);
// 出力結果
// 1|2|34|5|6
3と4がくっついてしまいました。
implodeで変換したものをresultにくっつけるのではなく、1つの配列を作って一気に変換してみようと思います。
$array = [[1,2,3],[4,5,6]];
$resultArray = array();
foreach($array as $value1){
foreach($value1 as $value2){
array_push($resultArray, $value2);
}
}
$result = implode("|",$resultArray);
echo($result);
// 出力結果
// 1|2|3|4|5|6
この書き方ならできるけど、foreachのネストが深くなってしまって読みにくいです。
どうしたものか。
調べてみると、PHPにはarray_mapというものがあるらしい。
これを使ってみます。
試したこと② array_map
array_map — 指定した配列の要素にコールバック関数を適用する
公式にはこのように記載されていました。
つまり、foreachみたいに配列の各要素に対してそれぞれ処理できて、それを配列で返すことができるよってことだと思います。
これを使用して、まずimplodeした者同士の配列を作って、次にそれをimplodeしてみました。
[[1,2,3],[4,5,6]]
↓
["1|2|3","4|5|6"]
↓
1|2|3|4|5|6
こうやって段階的に変換していく作戦です。
$array = [[1,2,3],[4,5,6]];
function imp($value)
{
return implode("|", $value);
}
$result = implode("|", array_map('imp', $array));
echo($result);
// 出力結果
// 1|2|3|4|5|6
さっきのforeachよりは読みやすくなった気はしますが、implodeが2回使っているのも気持ち悪い気がします。
なんとかimplodeを1回で書く方法はないだろうか。
さらに調べていくと、array_reduceというものがあるらしいと分かりました。
試したこと③ array_reduce
コールバック関数を繰り返し配列に適用し、配列をひとつの値にまとめる
公式にはこのように記載されていました。
つまり、配列すべてに対して指定した関数を実行してくれるらしい?
ということは、$arrayのすべてに対してarray_mergeかけて一気にimplodeできそう。
[[1,2,3],[4,5,6]]
↓
[1,2,3,4,5,6]
↓
1|2|3|4|5|6
こんな感じの作戦です。
$array = [[1,2,3],[4,5,6]];
$result = implode("|", array_reduce($array, 'array_merge', []));
echo($result);
// 出力結果
// 1|2|3|4|5|6
お、いい感じにまとめられました!
おわりに
同じ出力結果を出すだけでも様々な方法があるので、一回できたらあきらめるのではなく、もっといいやり方を探すのが大事なんだなと思いました。
今後とも自分の気づきなどを記事にして行けたらなと思います。
最後まで読んでいただきありがとうございました!