YaLinqo\Enumerable::join PHP Method

join() public method

Syntax: join (inner [, outerKeySelector {(v, k) ==> key} [, innerKeySelector {(v, k) ==> key} [, resultSelectorValue {(v1, v2, k) ==> value} [, resultSelectorKey {(v1, v2, k) ==> key}]]]])

A join refers to the operation of correlating the elements of two sources of information based on a common key. Join brings the two information sources and the keys by which they are matched together in one method call. This differs from the use of {@link selectMany}, which requires more than one method call to perform the same operation.

Join preserves the order of the elements of the source, and for each of these elements, the order of the matching elements of inner.

In relational database terms, the Join method implements an inner equijoin. 'Inner' means that only elements that have a match in the other sequence are included in the results. An 'equijoin' is a join in which the keys are compared for equality. A left outer join operation has no dedicated standard query operator, but can be performed by using the {@link groupJoin} method.

public join ( array | Iterator | IteratorAggregate | Enumerable $inner, callable | null $outerKeySelector = null, callable | null $innerKeySelector = null, callable | null $resultSelectorValue = null, callable | null $resultSelectorKey = null ) : Enumerable
$inner array | Iterator | IteratorAggregate | Enumerable The sequence to join to the source sequence.
$outerKeySelector callable | null {(v, k) ==> key} A function to extract the join key from each element of the source sequence. Default: key.
$innerKeySelector callable | null {(v, k) ==> key} A function to extract the join key from each element of the second sequence. Default: key.
$resultSelectorValue callable | null {(v1, v2, k) ==> result} A function to create a result value from two matching elements. Default: {(v1, v2, k) ==> array(v1, v2)}.
$resultSelectorKey callable | null {(v1, v2, k) ==> result} A function to create a result key from two matching elements. Default: {(v1, v2, k) ==> k} (keys returned by outerKeySelector and innerKeySelector functions).
return Enumerable
    public function join($inner, $outerKeySelector = null, $innerKeySelector = null, $resultSelectorValue = null, $resultSelectorKey = null)
    {
        $inner = self::from($inner);
        $outerKeySelector = Utils::createLambda($outerKeySelector, 'v,k', Functions::$key);
        $innerKeySelector = Utils::createLambda($innerKeySelector, 'v,k', Functions::$key);
        /** @noinspection PhpUnusedParameterInspection */
        $resultSelectorValue = Utils::createLambda($resultSelectorValue, 'v1,v2,k', function ($v1, $v2, $k) {
            return [$v1, $v2];
        });
        /** @noinspection PhpUnusedParameterInspection */
        $resultSelectorKey = Utils::createLambda($resultSelectorKey, 'v1,v2,k', function ($v1, $v2, $k) {
            return $k;
        });
        return new self(function () use($inner, $outerKeySelector, $innerKeySelector, $resultSelectorValue, $resultSelectorKey) {
            $lookup = $inner->toLookup($innerKeySelector);
            foreach ($this as $ok => $ov) {
                $key = $outerKeySelector($ov, $ok);
                if (isset($lookup[$key])) {
                    foreach ($lookup[$key] as $iv) {
                        (yield $resultSelectorKey($ov, $iv, $key) => $resultSelectorValue($ov, $iv, $key));
                    }
                }
            }
        });
    }