Найти ключ массива в массиве объектов с учетом значения атрибута

У меня есть такой массив объектов:

Array
(
    [945] => member Object
        (
            [id] => 13317
            [name] => Test 999
            [last_name] => Test 999
        )

    [54] => member Object
        (
            [id] => 13316
            [name] => Manuel
            [last_name] => Maria parra
        )

    [654] => member Object
        (
            [id] => 13315
            [name] => Byron 
            [last_name] => Castillo
        )

    [656] => member Object
        (
            [id] => 13314
            [name] => Cesar
            [last_name] => Vasquez
        )
)

Мне нужно удалить один из этих объектов в соответствии со значением атрибута.
Например, я хочу удалить из массива объект с идентификатором 13316.


person el_quick    schedule 12.11.2010    source источник


Ответы (5)


Вот функциональный подход:

$neededObjects = array_filter(
    $objects,
    function ($e) use ($idToFilter) {
        return $e->id != $idToFilter;
    }
);
person erisco    schedule 12.11.2010
comment
чувак, массив - это первый параметр array_filter, а не последний! php.net/manual/en/function.array-filter.php - person Pierlo Upitup; 03.12.2012
comment
Отлично, стоит отметить, что вы можете определить замыкание, например function ($e) use ($id_to_find) {, чтобы иметь возможность передавать переменную, содержащую идентификатор для поиска. Возможно, я единственный, кто этого не знал ;) Руководство по PHP - Пример 3 - person Ollie; 29.03.2013
comment
Удивительно .. спасибо: D Я использовал его, чтобы сравнить, присутствуют ли элементы массива arrayA в массиве объектов. $массивA=массив(14,18,30,50); $neededObjects = array_filter( $objects, function ($e) { return in_array ($e-›id,$arrayA); } ); - person Parag; 31.01.2015

Поскольку уже есть множество решений, я предлагаю альтернативу использованию массива:

$storage = new SplObjectStorage;  // create an Object Collection
$storage->attach($memberObject);  // add an object to it
$storage->detach($memberObject);  // remove that object

Вы можете превратить это в собственный класс MemberCollection с методами Finder и другими служебными операциями, например.

class MemberCollection implements IteratorAggregate
{
    protected $_storage;
    public function __construct()
    {
        $this->_storage = new SplObjectStorage;
    }
    public function getIterator()
    {
        return $this->_storage;
    }
    public function addMember(IMember $member)
    {
        $this->_storage->attach($member);
    }
    public function removeMember(IMember $member)
    {
        $this->_storage->detach($member);
    }
    public function removeBy($property, $value)
    {
        foreach ($this->_storage as $member) {
            if($member->$property === $value) {
                $this->_storage->detach($member);
            }
        }
    }        
}

Хотя это может быть излишним для вашего сценария.

person Gordon    schedule 12.11.2010

Использовать функцию поиска по массиву:

//return array index of searched item

$key = array_search($search_value, array_column($list, 'column_name'));

$list[key]; //return array item
person Govind Samrow    schedule 21.06.2016

person    schedule
comment
Если вы переопределите свою функцию с точки зрения array_filter, вы заработаете мой голос: D Возможно, filter_by_key было бы лучшим именем. - person erisco; 12.11.2010
comment
@erisco, несмотря ни на что, я изменил его на filter_by_key, как вы и рекомендовали. - person Jacob Relkin; 12.11.2010
comment
Моя интуиция такова, что элемент является значением, поэтому filter_by_member возвращает все элементы, которые удовлетворяют предикату на основе его значения (просто обычный фильтр). Еще одно соглашение состоит в том, что функция фильтра обычно исключает только то, что не удовлетворяет предикату. Вот почему я хотел бы, чтобы функция была переписана с использованием array_filter, а почему бы и нет, поскольку array_filter уже предопределен, чтобы делать то, что вам нужно? - person erisco; 12.11.2010

person    schedule
comment
Спасибо за ваш ответ, я отредактировал свой ответ, мои ключи не отсортированы, я имею в виду, что они не 0, 1, 2, 3 ... пожалуйста, взгляните на мой awnser по-новому, я изменил ключи массива, спасибо ! - person el_quick; 12.11.2010