ArrayWrapper for PHPで今まではJOINのキーには連想配列のキー名を指定するだけしかできませんでしたが、ラムダ式を渡せるようになりました。
これによって、指定したキーの値が連想配列だった場合など、さらに深い項目をキーに指定したり、加工した結果をキーに指定したりすることができるようになりました。
また、INNER JOINのみ対応していましたが、LEFT JOINにも対応することでJOINの活用の幅が広がりました。
ArrayWrapper for PHP
まず最初に、ラムダ式が指定できるようになった説明から・・・
今までは、
$leftArray = array(
array("key" => 2,"name" => "Nasal Hair Cutter"),
array("key" => 3,"name" => "scissors"),
array("key" => 5,"name" => "knife")
);
$rightArray = array(
array("id" => 1,"item_id" => 2,"value" => 10),
array("id" => 2,"item_id" => 2,"value" => 20),
array("id" => 3,"item_id" => 2,"value" => 30),
array("id" => 4,"item_id" => 3,"value" => 40),
array("id" => 5,"item_id" => 3,"value" => 50),
array("id" => 6,"item_id" => 5,"value" => 60),
array("id" => 7,"item_id" => 5,"value" => 70),
);
という配列に対して
//joinの引数は
//Join対象の配列,
//元の配列のキー一覧,
//join対象のキー一覧,
//joinした結果を表すmap関数,
//INNER JOINかLEFT JOINかを規定する
//となっている。
$actual = ArrayWrapper::Wrap($leftArray)
->join($rightArray,
array("key"),
array("item_id"),
function ($leftValue,$rightValue)
{
return
array("item_id" => $rightValue["item_id"],
"name" => $leftValue["name"],
"value" => $rightValue["value"]);
})
->toVar();
とキー指定のところに注目すると
array("key"),
array("item_id"),
と書いていましたが、キーにラムダ式を入れられるようになったので、
$target = ArrayWrapper::Wrap($leftArray);
$actual = $target
->join($rightArray,
array("key"),
array(function($x){return $x["item_id"];}),
function ($leftValue,$rightValue)
{
return
array("item_id" => $rightValue["item_id"],
"name" => $leftValue["name"],
"value" => $rightValue["value"]);
})
->toVar();
と
array("key"),
array(function($x){return $x["item_id"];}),
のようにJOINするためのKEYの一覧に”function($x){return $x[“item_id”];}”というようなラムダも渡せるようになりました。
この機能、今みたいな配列の直近のIndexで解決できるものは、全然嬉しくないんですが、
“function($x){return $x[“a”][“b”];}”みたいに、何段か下の値を持ってきたい場合や、ある程度丸めて比較したい場合なんかに効果を発揮します。(実際に使っていてかなりの効果を得られています。)
次にLEFT JOINの説明です。
以下のように、Joinの最後の引数にJoinType::LEFTと渡してあげることで、left joinになります。
$target = ArrayWrapper::Wrap($leftArray);
$actual = $target
->join($rightArray,
array("key"),
array("item_id"),
function ($leftValue,$rightValue)
{
return
array("item_id" => $leftValue["key"],
"name" => $leftValue["name"],
"value" => isset($rightValue) ? $rightValue["value"]:0);
},JoinType::LEFT)
->toVar();