2011年4月18日月曜日

PHP 2次元配列の転置

2次元配列==2段配列の中身を転置する。
機会は少ないと思いますが、やるとそこそこ面倒な処理。

筆者も流石に、馬鹿正直に2重ループで実装するところでしたが、

別件の調査中で、なかなか素晴らしい実装を発見しました。
http://blog.supermomonga.com/articles/php/array-to-transverse-matrix.html
実際試して見ましたが。動きますね。挙動が判りません。なんで?

余りにも判らなかったので、簡単なテストスクリプトを書いて試してみました。
https://gist.github.com/2472007b35430b6d71da

call_user_func_arrayが構文としてキモいので、判りにくくなってますが、

  • array_mapの
  • 第1引数のcallbackにnullを
  • 第2引数以降に、配列の2次元目を展開して、複数の配列として
可変長引数をサポートしている言語であれば、もっと美しく書けてるところでしょう。

オフィシャルのドキュメントすら「callbackにnullを入れる」という諸行の解説がありませんので、ほとんど裏技でしょう。
しかも、それにより、callback関数の引数に入れるはずだったモノがそのまま出てくるらしい。

結果的に、どうやらarray_map標準の機能しか使ってないということになります。
http://jp2.php.net/array_map
文中で「にいさん」と呼んでるお方は、PHPマスタークラスと思われます。