按值从多维数组中获取键



我需要通过搜索"底层"值从多维数组中获得所有"顶层"键。下面是一个数组的例子:

$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
)

相关内容

  • 没有找到相关文章

最新更新