我需要通过搜索"底层"值从多维数组中获得所有"顶层"键。下面是一个数组的例子:
$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
对内存非常重,只有当数组有1000 +项时才会增长。它需要遍历所有人,即使数组最顶端只有3个人拥有"Book 2"。
我一直试图通过使用array_search
, array_keys
, array_column
等内置函数获得"Book 2"的人员来优化它,然后才为找到的人员运行foreach
,但我没有运气获得"顶级"键。
是否可以优化或使用内置函数来搜索多维数组?
一种方法是先过滤它。现在您的结果结构类似于$list
,但它只包含所需的图书元素:
$find = 'Book 2';
$result = array_filter($list, function($v) use($find) {
return in_array($find, $v['books_on_hand']);
});
如果你只对person key和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
)