2
0

【PHP】2次元配列をimplodeしたかった話

Posted at

はじめに

ある日こんなことを思いました。

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

お、いい感じにまとめられました!

おわりに

同じ出力結果を出すだけでも様々な方法があるので、一回できたらあきらめるのではなく、もっといいやり方を探すのが大事なんだなと思いました。

今後とも自分の気づきなどを記事にして行けたらなと思います。

最後まで読んでいただきありがとうございました!

2
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0