PHP – 通过对象数组中的对象属性查找条目

数组看起来像:

[0] => stdClass Object ( [ID] => 420 [name] => Mary ) [1] => stdClass Object ( [ID] => 10957 [name] => Blah ) ... 

我有一个称为$v的整数variables。

我怎么能select一个数组条目,其中的“ID”属性具有$v值的对象?

你要么迭代数组,search特定的logging(一次只能search到),要么使用另一个关联数组构build一个hashmap。

对于前者,像这样的东西

 $item = null; foreach($array as $struct) { if ($v == $struct->ID) { $item = $struct; break; } } 

有关后者的更多信息,请参阅此问题及后续答案 – 由多个索引引用PHP数组

YurkamTim是正确的。 它只需要修改:(对不起,我现在不能评论)。

在函数($)之后,你需要一个指向外部variables的指针“use(&$ searchingValue)”,然后你可以访问外部variables。 你也可以修改它。

 $neededObject = array_filter( $arrayOfObjects, function ($e) use (&$searchedValue) { return $e->id == $searchedValue; } ); 

我刚在这里find了更优雅的解决scheme。 适应于它可能看起来像这样的问题:

 $neededObject = array_filter( $arrayOfObjects, function ($e) { return $e->id == $searchedValue } ); 
 class ArrayUtils { public static function objArraySearch($array, $index, $value) { foreach($array as $arrayInf) { if($arrayInf->{$index} == $value) { return $arrayInf; } } return null; } } 

使用你想要的方式会是这样的:

 ArrayUtils::objArraySearch($array,'ID',$v); 

我有时候喜欢使用array_reduce()函数来执行search。 它与array_filter()类似,但不影响search数组,允许您在同一个对象数组上执行多个search。

 $haystack = array($obj1, $obj2, ...); //some array of objects $needle = 'looking for me?'; //the value of the object's property we want to find //carry out the search $search_results_array = array_reduce( $haystack, function($result_array, $current_item) use ($needle){ //Found the an object that meets criteria? Add it to the the result array if ($current_item->someProperty == $needle){ $result_array[] = $current_item; } return $result_array; }, array() //initially the array is empty (ie: item not found) ); //report whether objects found if (count($search_results_array) > 0){ echo "found object(s): "; print_r($search_results_array[0]); //sample object found } else { echo "did not find object(s): "; } 

修复@YurkaTim的一个小错误,你的解决scheme适用于我,但增加了use

要在函数内部使用$searchedValue ,可以在函数参数function ($e) HERE后面use ($searchedValue)

array_filter函数只返回$neededObject ,如果return上的条件为true

如果$searchedValue是一个string或整数:

 $searchedValue = 123456; // Value to search. $neededObject = array_filter( $arrayOfObjects, function ($e) use ($searchedValue) { return $e->id == $searchedValue; } ); var_dump($searchedValue); // To see the output 

如果$searchedValue是我们需要检查列表的数组:

 $searchedValue = array( 1, 5 ); // Value to search. $neededObject = array_filter( $arrayOfObjects, function ( $e ) use ( $searchedValue ) { return in_array( $e->term_id, $searchedValue ); } ); var_dump($searchedValue); // To see the output 

我用某种Java键盘映射做了这个。 如果你这样做,你不需要每次循环对象数组。

 <?php //This is your array with objects $object1 = (object) array('id'=>123,'name'=>'Henk','age'=>65); $object2 = (object) array('id'=>273,'name'=>'Koos','age'=>25); $object3 = (object) array('id'=>685,'name'=>'Bram','age'=>75); $firstArray = Array($object1,$object2); var_dump($firstArray); //create a new array $secondArray = Array(); //loop over all objects foreach($firstArray as $value){ //fill second key value $secondArray[$value->id] = $value->name; } var_dump($secondArray); echo $secondArray['123']; 

输出:

 array (size=2) 0 => object(stdClass)[1] public 'id' => int 123 public 'name' => string 'Henk' (length=4) public 'age' => int 65 1 => object(stdClass)[2] public 'id' => int 273 public 'name' => string 'Koos' (length=4) public 'age' => int 25 array (size=2) 123 => string 'Henk' (length=4) 273 => string 'Koos' (length=4) Henk 
 $arr = [ [ 'ID' => 1 ] ]; echo array_search(1, array_column($arr, 'ID')); // prints 0 (!== false) 

使用array_column重新索引将节省时间,如果你需要find多次:

 $lookup = array_column($arr, NULL, 'id'); // re-index by 'id' 

那么你可以简单地$lookup[$id]随意。