代码之家  ›  专栏  ›  技术社区  ›  el_quick

在给定属性值的对象数组中查找数组键

  •  24
  • el_quick  · 技术社区  · 15 年前

    我有一个这样的对象数组:

    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
            )
    )
    

    我需要根据属性值删除其中一个对象。
    例如,我想从数组中删除对象ID 13316。

    5 回复  |  直到 9 年前
        1
  •  73
  •   erisco    11 年前

    功能方法如下:

    $neededObjects = array_filter(
        $objects,
        function ($e) {
            return $e->id != 13316;
        }
    );
    
        2
  •  4
  •   Jacob Relkin    15 年前
    function filter_by_key($array, $member, $value) {
       $filtered = array();
       foreach($array as $k => $v) {
          if($v->$member != $value)
             $filtered[$k] = $v;
       }
       return $filtered;
    }
    
    $array = ...
    $array = filter_by_key($array, 'id', 13316);
    
        3
  •  3
  •   Gordon Haim Evgi    15 年前

    由于已经给出了大量的解决方案,我建议使用该阵列的替代方案:

    $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);
                }
            }
        }        
    }
    

    不过,对于你的场景来说,可能是杀伤力太大了。

        4
  •  2
  •   Govind Samrow    9 年前

    使用数组搜索功能:

    //return array index of searched item
    
    $key = array_search($search_value, array_column($list, 'column_name'));
    
    $list[key]; //return array item
    
        5
  •  0
  •   bcosca    15 年前
       foreach ($array as $key=>$value)
          if ($value->id==13316) {
             unset($array[$key]);
             break;
          }