【问题标题】:Find array key in objects array given an attribute value在给定属性值的对象数组中查找数组键
【发布时间】:2011-05-09 03:33:38
【问题描述】:

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

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。

【问题讨论】:

    标签: php arrays object


    【解决方案1】:
       foreach ($array as $key=>$value)
          if ($value->id==13316) {
             unset($array[$key]);
             break;
          }
    

    【讨论】:

    • 谢谢你的回答,我已经编辑了我的答案,我的键没有排序,我的意思是,它们不是 0、1、2、3 ......请重新看看我的 awnser ,我改变了数组键,thk!
    【解决方案2】:
    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);
    

    【讨论】:

    • 如果您根据array_filter 重新定义您的功能,您将赢得我的支持:D 也许filter_by_key 会是一个更好的名字。
    • @erisco,无论如何我按照你的建议将其更改为filter_by_key
    • 我的直觉是成员是一个值,因此 filter_by_member 将返回所有满足基于其值的谓词的成员(只是一个常规过滤器)。另一个约定是过滤函数通常只排除满足谓词的事物。这就是为什么我希望看到使用 array_filter 重写的函数,为什么不因为 array_filter 已经预定义了你需要的东西?
    【解决方案3】:

    这里是函数式方法:

    $neededObjects = array_filter(
        $objects,
        function ($e) use ($idToFilter) {
            return $e->id != $idToFilter;
        }
    );
    

    【讨论】:

    • dude 数组是第一个 array_filter 参数,而不是最后一个! php.net/manual/en/function.array-filter.php
    • 完美,值得注意的是,您可以定义像function ($e) use ($id_to_find) { 这样的闭包,以便能够传递包含要搜索的ID 的var。也许我是唯一一个不知道这一点的人;)PHP Manual - Example 3
    • 太棒了.. 谢谢:D 我用它来比较数组元素 arrayA 是否存在于对象数组中。 $arrayA=array(14,18,30,50); $neededObjects = array_filter( $objects, function ($e) { return in_array ($e->id,$arrayA); } );
    【解决方案4】:

    由于已经给出了很多解决方案,我建议使用数组的替代方法:

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

    您可以使用 Finder 方法和其他实用程序操作将其制成自定义 MemberCollection 类,例如

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

    不过,对于您的场景来说,这可能有点矫枉过正。

    【讨论】:

      【解决方案5】:

      使用数组搜索功能:

      //return array index of searched item
      
      $key = array_search($search_value, array_column($list, 'column_name'));
      
      $list[key]; //return array item
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-10-31
        • 1970-01-01
        • 2022-07-08
        • 2010-10-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多