2014-09-01 31 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