Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
return new Enumerable(function () use ($self, $inner, $outerKeySelector, $innerKeySelector, $resultSelectorValue, $resultSelectorKey)
{
/** @var $self Enumerable */
/** @var $inner Enumerable */
/** @var $arrIn array */
$itOut = $self->getIterator();
$itOut->rewind();
$lookup = $inner->toLookup($innerKeySelector);
$arrIn = null;
$posIn = 0;
$key = null;
return new Enumerator(function ($yield) use ($itOut, $lookup, &$arrIn, &$posIn, &$key, $outerKeySelector, $resultSelectorValue, $resultSelectorKey)
{
/** @var $itOut \Iterator */
/** @var $lookup \YaLinqo\collections\Lookup */
while ($arrIn === null || $posIn >= count($arrIn)) {
if ($arrIn !== null)
$itOut->next();
if (!$itOut->valid())
return false;
$key = call_user_func($outerKeySelector, $itOut->current(), $itOut->key());
$arrIn = $lookup[$key];
$posIn = 0;
}
$args = array($itOut->current(), $arrIn[$posIn], $key);
$yield(call_user_func_array($resultSelectorValue, $args), call_user_func_array($resultSelectorKey, $args));
$posIn++;
return true;
});
});return new Enumerable(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);
}
});where в полном составе, например:public function where ($predicate)
{
$predicate = Utils::createLambda($predicate, 'v,k');
return new Enumerable(function () use ($predicate) {
foreach ($this as $k => $v)
if ($predicate($v, $k))
yield $k => $v;
});
}return new Enumerable(function () use ($predicate) в принципе можно выкинуть. Это наследие от первой версии, надо убедиться, что это не сломает какую-то логику.)
LINQ для PHP: скорость имеет значение