#php 向け #LINQ もどきArrayWrapper for PHPでleft joinとjoinキーにラムダを設定できるようにした

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();
Share