Выражения LINQ?

Есть ли способ использовать выражения LINQ в PHP? Например, в С# я могу сделать следующее:

List<string> names = new List<string>()
{
    "Francisco",
    "Ronald",
    "Araújo",
    "Barbosa"
};

var oneName = names.Where(x => x.Equals("Ronald")).FirstOrDefault();

И в PHP, как бы я сделал что-то вроде следующего?

names **.Where** (x => x.Equals("Ronald")) **.FirstOrDefault()**;

Ответ 1

Существует несколько библиотек PHP, которые имитируют функциональные возможности LINQ. Примерами являются:

В PHPLinq код будет выглядеть так:

$names = array("Francisco", "Ronald", "Araújo", "Barbosa"); 
$oneName = from('$name')->in($names)
            ->where('$x => $x == "Ronald"')
            ->firstOrDefault('$name');

Или с PINQ, который использует другой подход с закрытием PHP 5.3+:

$oneName = \Pinq\Traversable::from($names)
            ->where(function ($x) { return $x == 'Ronald'; })
            ->first();

Ответ 2

Я бы не рекомендовал PHPLinq, потому что это не то, к чему вы привыкли в .NET, даже если это похоже на LINQ. Причины таковы:

  • Порядок вызовов фиксирован (результат может быть не таким, как вы ожидаете).
  • Это не совсем лениво.

Сильной стороной PHPLinq является то, что она единственная реализация LINQ для PHP, которая поддерживает базы данных. Он больше не является единственным, TimeToogo PINQ поддерживает базы данных тоже, но на момент написания кода поставщик только LINQ LINQ - это демо-версия MySQL.

Если вам нужен запрос массивов и объектов в коде, вы должны использовать YaLinqo вместо *. Если вам нужна поддержка баз данных, единственным вариантом является PHPLinq, но имейте в виду его ограничения. Я настоятельно рекомендую использовать популярные готовые к производству альтернативы, достаточно ORM, AR и т.д.

Пример использования YaLinqo:

$names = array("Francisco", "Ronald", "Araújo", "Barbosa"); 
$oneName = from($names)->where('$x ==> $x == "Ronald"')->firstOrDefault();

* YaLinqo разработан мной.