2013-06-21 78 views
7

in_array函數可以比較對象嗎?PHP in_array對象比較?

例如,我有一個對象數組,我想將它們明顯地添加到另一個數組。是否有可能檢查一個對象是否已經被添加,如下所示:

in_array($distinct, $object); 

或者還有其他方法嗎?

+0

你對「獨特」的定義是什麼?如果「distinct」與引用相等是相反的,那麼僅僅傳入'true'作爲第三個參數就可以了。 – Jon

+0

所以這將與數組中的對象一起工作? – gorgi93

+1

有關「工作」的一些定義。你需要提供更多的細節,頭腦閱讀很難。 – Jon

回答

11

in_array功能無法比較的對象。

您應該從對象中創建唯一的鍵值對,只需要在將新對象插入到最終數組中時比較這些鍵。

假設每個對象具有唯一的id屬性,一個可能的解決辦法是:

$unique_objects = array(); 

// $data represents your object collection 
foreach ($data as $item) { 
    if (!array_key_exists($item->id, $unique_objects)) { 
     $unique_objects[$item->id] = $obj; 
    } 
} 
+0

它實際上工作... XD – gorgi93

+0

哈哈,什麼? $ idem不是任何地方的變量,也不是$ obj?這是如何投票13次? –

+0

好點。我已經更新了修復'$ idem'錯字的回覆。 這個示例代碼的假設是'$ obj'只是代表一個現有的變量,它需要唯一地添加到'$ unique_objects'數組中。 – ukliviu

9

可以使用嚴格的比較:

in_array($object, $array, TRUE); 

用例:

$a = new stdClass(); 
$a->x = 42; 

$b = new stdClass(); 
$b->y = 42; 

$c = new stdClass(); 
$c->x = 42; 

$array = array($a,$b); 

echo in_array($a, $array, true); // 1 
echo in_array($b, $array, true); // 1 
echo in_array($c, $array, true); // 
0

如果「STRICT」是「FALSE」,則通過在字符串中轉換elem來進行比較經濟需求。因此,如果您重寫__toString魔術函數,則應該可以比較對象元素。

1

我不知道是不是因爲一個較新的PHP版本,而是在我的項目中,在Ubuntu 12.04上使用PHP 5.3.16,它工作。它在我的一系列物體中找到了針狀物體。我也通過加載同一個類的不同對象進行了雙重檢查,並對照不包含該對象的數組內容進行了測試,結果確實返回了false。因此,in_array可以比較對象。

0

我想出了一個有點不同,我認爲更強大的選項。

function array_add_unique(&$array, $new, $test, $cb) { 
    if(is_array($array) && count($array)>0) { 
    for($i = 0; $i < count($array); $i++) { 
     if($array[$i][$test] == $new[$test]) { 
     $do = $cb($array[$i], $new); 
     if(is_bool($do) && $do) { $array[$i] = $new; } 
     else if(!is_bool($do)) { $array[$i] = $do; } 
     return; 
     } 
    } 
    } 
    array_push($array, $new); 
} 

這個解決方案的好處是它包括一個用戶可定義的回調來處理衝突。在添加獨特對象時,您可能希望保留舊對象和新對象的屬性。

可以是匿名函數的回調接收新對象和現有對象,以便用戶可以進行自定義計算。返回true只需替換現有的對象,或者返回一個新的對象(非bool)來替換它。

雖然我不知道大數據集上的性能。

0

有很多方法可以做到這一點,你可以看到。我只是想我會再添加一個。我不知道爲什麼,但是當處理對象數組時,我喜歡使用使用回調函數的數組函數。

如果你的對象有任何形式的標識符,他們應該,如果你想測試他們的重複這,下面的工作:

$found = array_filter($uniqueObjects, function($uniqueObject) use ($object) { 
    return $uniqueObject->id == $object->id 
}); 

if (!$found) { 
    $uniqueObjects[] = $object; 
} 

$object是你要找的對象,而$uniqueObjects是您正在搜索的對象數組是否存在。只需在識別屬性上匹配uniqueObject和object,如id