2014-09-01 62 views
1

我有以下数组。我如何删除(取消设置)以下两种场景中的所有元素?当属性是给定值时删除数组元素

  1. 删除prop等于“a”的所有元素。应删除元素0和2.
  2. 删除prop在数组中的所有元素(“a”,“d”)。应该删除元素0,2和3.

我明显可以迭代数组,并检查是否有匹配,但我期望有一种更有效的方法来做到这一点。

Array 
(
    [0] => obj Object 
     (
      [prop] => a 
     ) 

    [1] => obj Object 
     (
      [prop] => b 
     ) 

    [2] => obj Object 
     (
      [prop] => a 
     ) 

    [3] => obj Object 
     (
      [prop] => d 
     ) 

) 

回答

3

array_filterPHP documentation here)可能是为最佳的解决方案。

它当然会迭代你的数组,但是它将迭代逻辑从过滤逻辑中分离出来,从而更容易维护你的代码。

function filter_on_prop($val) { 
    $arr = ['a', 'b']; 
    return (!in_array($val->prop, $arr)); 
} 

$array = array_filter ($array, 'filter_on_prop'); 

随着一个匿名函数:

$array = array_filter ($array, function ($val) use ($filter) { 
    return (!in_array($val->prop, $filter)); 
}); 

$filter被你的阵列先前选择/填充来检查任何你想要的。

+0

感谢克莱门特。好的解决方案我想这也可以使用匿名函数完成? – user1032531 2014-09-01 13:56:41

+0

@ user1032531当然! – Sugar 2014-09-01 14:00:06

+0

我会试验并发布如何使用匿名函数完成。没有(或有)匿名,是否可以从函数内部移除'$ arr = ['a','b'];',这样用户可以选择更多?例如,我可以运行它[''','b']'以及'['a']' – user1032531 2014-09-01 14:10:39

0

您可以使用array_filter此:

$allowedProps = array('a','d'); 

$myfilter = function($val) use ($allowedProps) 
{ 
    return !in_array($val->prop, $allowedProps); 
} 

$myfilteredArray = array_filter($array, $myFilter); 
+0

Clément看起来更快:p – Pinoniq 2014-09-01 13:52:16