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]
随意。