2012-04-27 67 views
0

如何從對象的數組具有相同名稱刪除元素對象的數組元素?在下面的情況下,我想刪除元素0和2,因爲名稱是相同的。我想我可以循環每一個案件,但這似乎是浪費。卸下包含同名

array(1) { 
[0]=> object(stdClass)#268 (3) { 
     ["term_id"]=> string(3) "486" 
     ["name"]=> string(4) "2012" 
     ["count"]=> string(2) "40" 
} 
[1]=> object(stdClass)#271 (3) { 
     ["term_id"]=> string(3) "488" 
     ["name"]=> string(8) "One more" 
     ["count"]=> string(2) "20" 
} 
[2]=> object(stdClass)#275 (3) { 
     ["term_id"]=> string(3) "512" 
     ["name"]=> string(8) "2012" 
     ["count"]=> string(2) "50" 
} 

回答

2

你也可以遍歷數組,計算每個名字出現了多少次了。然後,使用array_filter過濾掉多次出現的元素。這將具有的O(n)的平均運行時間複雜度(假設爲O(1)陣列),相比於幼稚O(n^2)情況。

代碼:

$counter = array(); 
foreach($array as $val) { 
    $n = $val->name; 
    $counter[$n] = (!isset($counter[$n])) ? 1 : 2; 
} 
$result = array_filter(
      $array, 
      function ($item) use ($counter) { return $counter[$item->name] == 1; } 
     ); 

5.3之前,你不能使用閉,所以在這種情況下,修改代碼以這個PHP版本:

$counter = array(); 
foreach($array as $val) { 
    $n = $val->name; 
    $counter[$n] = (!isset($counter[$n])) ? 1 : 2; 
} 

function my_filter($item) { 
    global $counter; 
    return $counter[$item->name] == 1; 
} 
$result = array_filter(
      $array, 
      'my_filter' 
     ); 

注意,這是唯一有用的現實大型數組,因爲涉及到一些開銷。如果你不明白正在做什麼,它可能也很難閱讀。對於小陣列(幾百個元素左右),我建議您使用樸素的二次時間循環方法。

0
$result = array_filter(
    $array, 
    function ($item) use ($name) { return $item->name != $name; } 
); 

注意,這也正是這種「循環在任何情況下」你所提到的。沒有其他解決方案,如果你想檢查每個項目。

+0

咦,我不太清楚這是什麼做的是誠實的,但它似乎並不奏效。 – kylex 2012-04-27 17:43:42

+0

尚未設置'$ array'和'$ name'。你應該閱讀官方手冊(這個表達中沒有什麼特別的)。 – KingCrunch 2012-04-27 17:46:31

+0

誰能告訴我,爲什麼這個答案得到了'-1'這是這裏最好的答案.... – Baba 2012-04-27 18:00:41

2

如果它是可以修改的類的對象,你可以讓__toString()方法返回name屬性,並使用array_unique()

兩個因素被認爲是當且僅當(字符串)等於$ elem1 == =(字符串)$ elem2。用詞表示:當字符串表示是相同的。第一個元素將被使用。

+2

爲什麼不array_unique允許回調函數? PHP真的不一致。 – 2012-04-27 17:55:54