我需要通过搜索“底层”值来从多维数组中获取所有“顶级”键。以下是该数组的示例:
$list = array (
'person1' => array(
'personal_id' => '1',
'short_information' => 'string',
'books_on_hand' => array(
'Book 1',
'Book 2',
'Book 3',
)
),
'person2' => array(
'personal_id' => '2',
'short_information' => 'string',
'books_on_hand' => array(
'Book 4',
'Book 2',
'Book 5',
)
),
'person3' => array(
'personal_id' => '3',
'short_information' => 'string',
'books_on_hand' => array(
'Book 4',
'Book 2',
'Book 1',
'Book 3',
)
),
//etc...
);
我想知道手头有“第二册”的所有人。我可以像这样循环获取这些信息:
foreach ($list as $person => $info){
$check = array_search( 'Book 2', array_column($info, 'books_on_hand') );
if ( $check !== false ){
$results .= 'Name: '.$person;
$results .= 'ID: '.$info['personal_id'];
//get other infos other stuff, if necessary
}
}
问题是,在这种情况下foreach
对内存非常沉重,只有当数组有一千个+条目时才会增长更多。它需要贯穿所有人,即使阵列最顶端只有3人拥有“第2册”。
我一直在尝试通过使用内置函数(例如array_search
,array_keys
,array_column
)来获取“第2册”的人来优化它,然后才运行foreach
对于找到的人,但我没有运气获得“顶级”钥匙。
是否可以优化或使用内置函数来搜索多维数组?
答案 0 :(得分:1)
一种方法是首先过滤它。现在,您的结果的结构类似于$list
,但它只包含带有所需书籍的元素:
$find = 'Book 2';
$result = array_filter($list, function($v) use($find) {
return in_array($find, $v['books_on_hand']);
});
如果您感兴趣的是人员密钥和personal_id
,那么:
$find = 'Book 2';
$result = array_map(function($v) use($find) {
if(in_array($find, $v['books_on_hand'])) {
return $v['personal_id'];
}
}, $list);
对于拥有所需书籍的人,将返回此类内容:
Array
(
[person1] => 1
[person2] => 2
[person3] => 3
)
答案 1 :(得分:-1)
x = [x1, x2]