Answers:
您可以迭代数组,搜索特定记录(一次只能搜索一次),也可以使用另一个关联数组来构建哈希图。
对于前者,像这样
$item = null;
foreach($array as $struct) {
if ($v == $struct->ID) {
$item = $struct;
break;
}
}
请参阅此问题和后续答案以获取有关后者的更多信息- 通过多个索引引用PHP数组
isset($item)
但我更喜欢正确地初始化变量
if($v == $struct["ID"]){...
YurkamTim是正确的。它只需要修改:
在function($)之后,您需要通过“ use(&$ searchedValue)”来指向外部变量的指针,然后才能访问该外部变量。您也可以修改它。
$neededObject = array_filter(
$arrayOfObjects,
function ($e) use (&$searchedValue) {
return $e->id == $searchedValue;
}
);
&
导入时不需要$searchedValue
进入封闭范围。该&
用于创建如果其仅需要一个参考$searchedValue
已被封闭的内部改性。
global
是唯一的功能共享数据!但可惜的是,这确实很慢。:(
$arr = [
[
'ID' => 1
]
];
echo array_search(1, array_column($arr, 'ID')); // prints 0 (!== false)
我在这里找到了更优雅的解决方案。适应了这个问题,看起来可能像:
$neededObject = array_filter(
$arrayOfObjects,
function ($e) use ($searchedValue) {
return $e->id == $searchedValue;
}
);
array_filter
返回一个数组,并且不会在找到的第一个值处停止。
$searchedValue
在函数内部无法识别。但是在外面。
$searchedValue
超出了闭包范围。其次,您认为这些数组方法如何工作?它们都在内部遍历整个数组
$searchedValue
需求记录function ($e) use ($searchedValue) {
如果需要多次查找,使用array_column重新索引将节省时间:
$lookup = array_column($arr, NULL, 'id'); // re-index by 'id'
然后,您可以随心所欲$lookup[$id]
。
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);
解决了@YurkaTim的一个小错误,您的解决方案对我有用,但是添加了use
:
要$searchedValue
在函数内部使用,一种解决方案可以use ($searchedValue)
在函数参数之后function ($e) HERE
。
该array_filter
功能只对返回$neededObject
的,如果在返回时的条件是true
如果$searchedValue
是字符串或整数:
$searchedValue = 123456; // Value to search.
$neededObject = array_filter(
$arrayOfObjects,
function ($e) use ($searchedValue) {
return $e->id == $searchedValue;
}
);
var_dump($neededObject); // 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($neededObject); // To see the output
var_dump($neededObject);
:)
有时我喜欢使用array_reduce()函数进行搜索。它类似于array_filter(),但不影响搜索到的数组,从而使您可以对同一对象数组执行多个搜索。
$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 (i.e.: 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): ";
}
if ($current_item->someProperty == $needle){ $result_array[] = $current_item; }
我是用某种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
我在这里发布了我使用快速二进制搜索算法有效解决此问题的方法:https : //stackoverflow.com/a/52786742/1678210
我不想复制相同的答案。其他人提出的要求略有不同,但答案是相同的。