2014-09-01 7 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_filter (PHP 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

+0

@ user1032531 Конечно! – Sugar

+0

Я буду экспериментировать и публиковать, как это можно сделать с анонимной функцией. Без (или с) анонимного, возможно ли удалить '$ arr = ['a', 'b'];' изнутри функции, чтобы она была более удобной для пользователя? Например, я мог бы запустить его для '['a', 'b']', а также '['a']' – user1032531

0

Вы можете использовать array_filter для этого:

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

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

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

Похоже, Клемент был быстрее: p – Pinoniq

Смежные вопросы