0

別の属性配列を使用して、配列内のオブジェクト (または複数のオブジェクト) を見つけようとしています

この質問に出くわしました属性値が指定されたオブジェクト配列の配列キーを検索し、優れた解決策を見つけました。少し修正して、次のようになりました。

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

その行を変更して、指定されたすべての $attributes をテストするにはどうすればよいですか?

4

4 に答える 4

1

get_object_varsは公開属性のみを参照することに注意してください。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;
}
于 2013-10-23T06:11:01.040 に答える
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"
  }
}
于 2013-10-23T06:11:07.207 に答える
0

私はそれがあなたを助けることを願っています

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 [名前] => セザール [名字] => バスケス ) )

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'));
于 2013-10-23T06:18:10.997 に答える