ArrayWrapper for PHPで今まではJOINのキーには連想配列のキー名を指定するだけしかできませんでしたが、ラムダ式を渡せるようになりました。
これによって、指定したキーの値が連想配列だった場合など、さらに深い項目をキーに指定したり、加工した結果をキーに指定したりすることができるようになりました。
また、INNER JOINのみ対応していましたが、LEFT JOINにも対応することでJOINの活用の幅が広がりました。
まず最初に、ラムダ式が指定できるようになった説明から・・・
今までは、
$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();