2013-08-16 174 views
11

有沒有辦法在PHP中使用LINQ表達式? 例如,在C#中,我可以做到以下幾點:LINQ表達式?

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()**; 
+0

是否要使用[lambda表達式](http://msdn.microsoft.com/en-us/library/vstudio/bb397687.aspx)或[Linq](http://msdn.microsoft.com /en-us/library/vstudio/bb397926.aspx)? – interlude

+0

我想使用LINQ。可能嗎? –

+1

http://phplinq.codeplex.com/看看這個。 – interlude

回答

29

有幾個PHP庫可以模仿LINQ的功能。例子有:

在PHPLinq的代碼是這樣的:

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

或者WIT^h PINQ這需要與PHP 5.3+關閉了不同的方法:

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

我不會推薦PHPLinq,因爲它不是你在.NET中使用到什麼,即使它看起來像 LINQ。原因是:

  1. 調用順序是固定的(結果可能不是您所期望的)。
  2. 這並不是真正的懶惰。

PHPLinq的優勢在於它是唯一的支持數據庫的PHP的LINQ實現。它不再是唯一的一個,TimeToogo的PINQ也支持數據庫,但在撰寫本文時,PINQ唯一的LINQ提供商就是MySQL演示。

如果您只需要在代碼中查詢數組和對象,則應該使用YaLinqo而不是*。如果您需要數據庫支持,唯一的選擇是PHPLinq,但請注意其侷限性。我強烈建議使用流行的生產就緒的替代品,也有足夠的ORM,人工魚礁等使用YaLinqo

例子:

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

* YaLinqo是由我開發的。

+0

你可以添加對YoLinqo數據庫的支持嗎? – Pangamma

+1

@Pangamma它不在YaLinqo的範圍之內。 YaLinqo的優先考慮是轉換的速度,簡單性和多樣性,其中兩個不能很好地利用數據庫層(良好的LINQ to SQL轉換非常複雜,數據庫功能限制轉換次數),因此嚴格按照設計對象。TimeToogo的另一個LINQ端口[Pinq](TimeToogo/Pinq)支持數據庫,但結果是,它更復雜,更有限且速度更慢。其唯一的數據庫提供者是MySQL的演示,所以我猜數據庫功能不是生產就緒的。 – Athari

+0

@Pammaamma核心問題有兩個。首先,編寫一個生成敏感SQL的提供者很困難,非常困難。其次,PHP不提供像C#這樣的表達式支持,並且它不會很快發生(我希望至少會看到lambda表達式)。考慮到這一點,即使在不久的將來,LINQ to DB也不會發生在PHP中。你應該尋找替代解決方案。 – Athari