【php】2重配列の行列入れ替え

IT
スポンサーリンク

csvなどで1行にまとまっていれば扱い易いものが、

列にまたがっていてどうも扱いにくいという場面に直面しました。

 

対応として、行列を入れ替えてみようとなったので、

方法について書いていきます。

 

 

コード

$originalArray = [
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
];

// 行と列を入れ替えた新しい2重配列を作成するコールバック関数
$transposeCallback = function (...$rows) {
    return array_map(null, ...$rows);
};

// 2重配列の各要素の行と列を入れ替えて新しい2重配列を作成
$transposedArray = call_user_func_array($transposeCallback, $originalArray);

// 結果を表示
print_r($transposedArray);

 

結果はこのようになります

Array
(
    [0] => Array
        (
            [0] => 1
            [1] => 4
            [2] => 7
        )

    [1] => Array
        (
            [0] => 2
            [1] => 5
            [2] => 8
        )

    [2] => Array
        (
            [0] => 3
            [1] => 6
            [2] => 9
        )
)

 

解説

3点リーダ

phpでは3点リーダは可変長引数を指します。

今回の場合だと、各配列要素が展開されることを意味します。

$originalArray = [ [1, 2, 3], [4, 5, 6], [7, 8, 9] ];
↓ このように処理していることになります
array_map(null, [1, 2, 3], [4, 5, 6], [7, 8, 9]);

 

array_mapでは、第2引数以降の配列の各要素を取り出し、

第1引数の処理がnullなので、そのまま返却することになります。

結果、行列が入れ替わるということになります。

 

array_map(null, [1, 2, 3], [4, 5, 6], [7, 8, 9]);

[1, 2, 3] → 1 が取り出させれる → そのまま返却
[4, 5, 6] → 4 が取り出させれる → そのまま返却
[7, 8, 9] → 7 が取り出させれる → そのまま返却

これらが1つの配列として返却されるので[1, 4, 7]という要素が生まれる。

 

今回の場合だと、コールバック関数までは不要かもしれないですね。。

 

 

 

ブログランキング・にほんブログ村へ
にほんブログ村


人気ブログランキング

コメント

タイトルとURLをコピーしました