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]という要素が生まれる。
今回の場合だと、コールバック関数までは不要かもしれないですね。。
20代前半までは東京で音楽をやりながら両手の指以上の業種でアルバイト生活をしていましたが、某大手プロバイダのテレアポのバイトでPCの知識の無さに愕然とし、コンピュータをもっと知りたい!と思ったことをきっかけに25歳の時にITの世界に未経験で飛び込みました。
紆余曲折を経て、現在は個人事業主としてお仕事させていただいており、10年ほどになります。
web制作から企業システム構築、ツール開発など、フロントエンドもバックエンドもサーバーもDBAも依頼があれば何でもやってきた雑食系エンジニアです。
今風にいうとフルスタックエンジニアということになるのでしょうか??
→ 詳細プロフィールというか、生い立ちはこちら
→スキルシートをご覧になる場合はこちら
→お仕事のご依頼やお見積りなどお問い合わせはこちらから!
コメント