例えば、以下のようなデータ構造の配列があったとして、
<?php
class KeyValue {
public function __construct($k, $v) {
$this->key = $k;
$this->value = $v;
}
public $key;
public $value;
}
$a1 = array(
new KeyValue('a', 1),
new KeyValue('b', 2),
new KeyValue('c', 3),
);
以下のような連想配列
$a2 = array ('a' => 1, 'b' => 2, 'c' => 3);
を作るには、どうしたものでしょうか?
脊髄反射で思いつくのは、foreachで回すというところでしょうか?
$a2 = array();
foreach ($a as $pair) {
$a2[$pair->key] = $pair->value;
}
ループをまわすのは、なんか負けた気になります。
関数型プログラミングの世界では、こうゆう場合fold系関数を使います。
phpでは、昔からarray_reduceが用意されています。
また、ver 5.3から、初期値として任意のデータを渡せるようになってます。
そこで、以下のようにしても、同じ結果を得ることができます。
$a2 = array_reduce(
$a1,
function (&$results, $pair) { $results[$pair->key] = $pair->value; return $results; },
array()
);
使いどころとしては、
- 配列の配列を一気に初期化(配列の要素に連想配列を入れるとか)
- クロージャを再利用したい
とかでしょうか。
かなり俺得な投稿でしたね。失礼。