PHP:使用attributes数组在数组中查找对象

时间:2013-10-23 05:59:25

标签: php arrays

我正在尝试使用另一个属性数组

在数组中找到一个对象(或多个对象)

我遇到了这个问题Find array key in objects array given an attribute value并找到了很好的解决方案,我稍微修改了一下并最终得到了这个:

//$array = array(object1,object2,object3);
//$attributes example array('first_name'=>'value','last_name'=>'value');
function filter_by_key($array, $attributes) {
   $filtered = array();
   foreach($array as $k => $v) {
      //if($v->$member != $value) //stuck here 
         $filtered[$k] = $v;
   }
   return $filtered;
}

如何修改该行以测试所有给定的$属性?

4 个答案:

答案 0 :(得分:1)

注意 get_object_vars 仅查看 public 属性。可能更有效 ReflectionClass :: getProperties

在编辑器中编码,以测试:

//$array = array(object1,object2,object3);
//$attributes example array('first_name'=>'value','last_name'=>'value');
function filter_by_key($array, $attributes) {
   $filtered = array();
   foreach($array as $obj) {
       $found = true;
       $obj_attr = get_object_vars($obj);
       foreach($attributes as $attr => $val){
           if(!isset($obj_attr[$attr]) || $obj_attr[$attr] != $val){
               $found = false;
               break;
           } 
       } 
       if($found){
         $filtered[$k] = $obj;
       }
   }
   return $filtered;
}

答案 1 :(得分:1)

array_filter是过滤数组的专用方法:

function createObject($first, $last) {
   $object = new StdClass;
   $object->first_name = $first;
   $object->last_name = $last;
   return $object;
}

$array = array( createObject('value1', 'value1'), createObject('value', 'value'));
$attributes = array('first_name'=>'value','last_name'=>'value');

var_dump(array_filter($array, function ($element) use($attributes) {
   foreach ($attributes as $attribute => $value) {
        if (is_object($element) 
            && property_exists($element, $attribute) 
            && $element->{$attribute} !== $value
        ) {
            return false;
        }
   }
   return true;
}));

输出:

array(1) {
  [1]=>
  object(stdClass)#4 (2) {
    ["first_name"]=>
    string(5) "value"
    ["last_name"]=>
    string(5) "value"
  }
}

答案 2 :(得分:1)

//$array = array(object1,object2,object3);
//$attributes = array('first_name'=>'value','last_name'=>'value');
$filtered = array_filter($array,
        // that's the callback function that filters the object 
        function ($e){
            global $attributes; // we need to make $attributes 
                                // recognizable in the scope
            foreach($attributes as $k => $v){
                if($e[$k] == $v){ // only if object $e from the array has 
                                  // the same attribute and same value
                    return true;  // add this object to $filtered
                }
            }
            return false;
        }
);

答案 3 :(得分:0)

我希望它会帮助你

阵 (     [945] =>成员对象         (             [id] => 13317             [name] =>测试999             [last_name] =>测试999         )     [54] =>成员对象         (             [id] => 13316             [name] =>曼努埃尔             [last_name] =>玛丽亚帕拉         )     [654] =>成员对象         (             [id] => 13315             [name] =>拜伦             [last_name] =>卡斯蒂略         )     [656] =>成员对象         (             [id] => 13314             [name] =>塞萨尔             [last_name] =>瓦斯奎兹         ) )

function filter_by_key($array, $member, $attributes) {
$filtered = array();
foreach ($array as $k => $v) {
    if (in_array($v->$member, $attributes)) {
        $filtered[$k] = $v;
    }
}
return $filtered;

}

$filterd = filter_by_key($array, 'id', array('13316','13317'));