in_array
函數可以比較對象嗎?PHP in_array對象比較?
例如,我有一個對象數組,我想將它們明顯地添加到另一個數組。是否有可能檢查一個對象是否已經被添加,如下所示:
in_array($distinct, $object);
或者還有其他方法嗎?
in_array
函數可以比較對象嗎?PHP in_array對象比較?
例如,我有一個對象數組,我想將它們明顯地添加到另一個數組。是否有可能檢查一個對象是否已經被添加,如下所示:
in_array($distinct, $object);
或者還有其他方法嗎?
的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;
}
}
見http://php.net/manual/en/function.spl-object-hash.php
if (! array_key_exists(spl_object_hash($obj), $objects)) {
$objects[ spl_object_hash($obj) ] = $obj;
}
乾杯
可以使用嚴格的比較:
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); //
如果「STRICT」是「FALSE」,則通過在字符串中轉換elem來進行比較經濟需求。因此,如果您重寫__toString魔術函數,則應該可以比較對象元素。
我不知道是不是因爲一個較新的PHP版本,而是在我的項目中,在Ubuntu 12.04上使用PHP 5.3.16,它工作。它在我的一系列物體中找到了針狀物體。我也通過加載同一個類的不同對象進行了雙重檢查,並對照不包含該對象的數組內容進行了測試,結果確實返回了false。因此,in_array
可以比較對象。
我想出了一個有點不同,我認爲更強大的選項。
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)來替換它。
雖然我不知道大數據集上的性能。
有很多方法可以做到這一點,你可以看到。我只是想我會再添加一個。我不知道爲什麼,但是當處理對象數組時,我喜歡使用使用回調函數的數組函數。
如果你的對象有任何形式的標識符,他們應該,如果你想測試他們的重複這,下面的工作:
$found = array_filter($uniqueObjects, function($uniqueObject) use ($object) {
return $uniqueObject->id == $object->id
});
if (!$found) {
$uniqueObjects[] = $object;
}
$object
是你要找的對象,而$uniqueObjects
是您正在搜索的對象數組是否存在。只需在識別屬性上匹配uniqueObject和object,如id
。
你對「獨特」的定義是什麼?如果「distinct」與引用相等是相反的,那麼僅僅傳入'true'作爲第三個參數就可以了。 – Jon
所以這將與數組中的對象一起工作? – gorgi93
有關「工作」的一些定義。你需要提供更多的細節,頭腦閱讀很難。 – Jon