2012-04-27 63 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