PHP 多维数组键查找
PHP multidimension array key search
所以,我有多维数组(例如):
array[1][22]['name']
array[1][33]['name']
array[2][44]['name']
array[3][55]['name']
我知道最后一个数组键(它的 ID)(例如 - [44]),如何找到已知键的 [name] 的值?
我猜我需要类似 array_search 的东西,但是对于键和多维数组...
你最好改变你的数组结构:
$array = [
22 => [ 'name' => 'A'],
33 => [ 'name' => 'B'],
44 => [ 'name' => 'C'],
55 => [ 'name' => 'D'],
];
然后简单地写
$array[44]['name']
这是 PHP >= 5.5.0 的简单方法。这假设数组中只有一个键 44
:
echo array_column($array, 44)[0]['name'];
// or
echo current(array_column($array, 44))['name'];
早期版本:
foreach($array as $k => $v) { if(isset($v[44])) echo $v[44]['name']; }
针对此搜索优化您的数组不是更好吗,例如构建另一个以 ID 作为键并将对数据的引用作为值的数组?
When building your array you could:
$IDsIndex = array();
foreach(...) {
$IDsIndex[$ID] = &$data;
}
然后:
$IDsIndex[44]['name'];
我有一个似乎适合我的功能。如果您发现它不足,请告诉我。注意:尚未针对大型数组或对象的性能进行测试。
function arrayKeySearch(array $haystack, string $search_key, &$output_value, int $occurence = 1){
$result = false;
$search_occurences = 0;
$output_value = null;
if($occurence < 1){ $occurence = 1; }
foreach($haystack as $key => $value){
if($key == $search_key){
$search_occurences++;
if($search_occurences == $occurence){
$result = true;
$output_value = $value;
break;
}
}else if(is_array($value) || is_object($value)){
if(is_object($value)){
$value = (array)$value;
}
$result = arrayKeySearch($value, $search_key, $output_value, $occurence);
if($result){
break;
}
}
}
return $result;
}
所以,我有多维数组(例如):
array[1][22]['name']
array[1][33]['name']
array[2][44]['name']
array[3][55]['name']
我知道最后一个数组键(它的 ID)(例如 - [44]),如何找到已知键的 [name] 的值?
我猜我需要类似 array_search 的东西,但是对于键和多维数组...
你最好改变你的数组结构:
$array = [
22 => [ 'name' => 'A'],
33 => [ 'name' => 'B'],
44 => [ 'name' => 'C'],
55 => [ 'name' => 'D'],
];
然后简单地写
$array[44]['name']
这是 PHP >= 5.5.0 的简单方法。这假设数组中只有一个键 44
:
echo array_column($array, 44)[0]['name'];
// or
echo current(array_column($array, 44))['name'];
早期版本:
foreach($array as $k => $v) { if(isset($v[44])) echo $v[44]['name']; }
针对此搜索优化您的数组不是更好吗,例如构建另一个以 ID 作为键并将对数据的引用作为值的数组?
When building your array you could:
$IDsIndex = array();
foreach(...) {
$IDsIndex[$ID] = &$data;
}
然后:
$IDsIndex[44]['name'];
我有一个似乎适合我的功能。如果您发现它不足,请告诉我。注意:尚未针对大型数组或对象的性能进行测试。
function arrayKeySearch(array $haystack, string $search_key, &$output_value, int $occurence = 1){
$result = false;
$search_occurences = 0;
$output_value = null;
if($occurence < 1){ $occurence = 1; }
foreach($haystack as $key => $value){
if($key == $search_key){
$search_occurences++;
if($search_occurences == $occurence){
$result = true;
$output_value = $value;
break;
}
}else if(is_array($value) || is_object($value)){
if(is_object($value)){
$value = (array)$value;
}
$result = arrayKeySearch($value, $search_key, $output_value, $occurence);
if($result){
break;
}
}
}
return $result;
}