我正在尝试使用另一个属性数组
在数组中找到一个对象(或多个对象)我遇到了这个问题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;
}
如何修改该行以测试所有给定的$属性?
答案 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'));