LINQ表达式?

11

有没有办法在PHP中使用LINQ表达式?例如,在C#中,我可以这样做:

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
你想使用lambda表达式还是Linq? - interlude
我想使用LINQ。这是可能的吗? - Ronald Araújo
1
请看这个:http://phplinq.codeplex.com/ - interlude
2个回答

29

有一些 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();

所有这些似乎都被抛弃了... - bertasoft

3
我不建议使用PHPLinq,因为它与.NET中的不同,即使它看起来像LINQ。原因如下:
  1. 调用顺序是固定的(结果可能不符合您的期望)。
  2. 它并非真正的惰性计算。
PHPLinq的优点是它是支持数据库的PHP LINQ实现中唯一的一种。但现在,TimeToogo的PINQ也支持数据库,但在编写本文时,PINQ的唯一LINQ提供程序是MySQL demo。
如果您只需要在代码中查询数组和对象,则应改用YaLinqo。如果您需要数据库支持,则唯一选择是PHPLinq,但请注意其限制。我强烈建议使用流行的生产就绪的替代方案,有足够的ORM、AR等可选。
使用YaLinqo的示例:
$names = array("Francisco", "Ronald", "Araújo", "Barbosa"); 
$oneName = from($names)->where('$x ==> $x == "Ronald"')->firstOrDefault();

* YaLinqo由我开发。


你能为 YoLinqo 添加数据库支持吗? - Pangamma
1
@Pangamma 这已经超出了YaLinqo的范围。YaLinqo的优先级是速度、简单性和转换的多样性,其中两个与DB层不兼容(良好的LINQ to SQL转换非常复杂,而且DB功能限制了转换数量),因此它是严格按照对象的LINQ设计的。TimeToogo的Pinq是另一个LINQ端口,支持数据库,但结果更加复杂、更加有限并且明显更慢。它唯一的DB提供程序是MySQL的演示版,所以我想DB功能还没有准备好投入生产。 - Athari
@Pangamma,从本质上讲,有两个问题。首先,编写生成合理SQL的提供程序非常困难。其次,PHP不像C#那样提供表达式支持,并且短时间内不会发生这种情况(我希望我们至少能看到lambda)。考虑到这一点,在短期内甚至可能永远不会在PHP中出现LINQ to DB。您应该寻找替代解决方案。 - Athari
很好。当你不想要太多的开销时,简单是有价值的。 - Pangamma

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接