按值从多维数组中获取键

时间:2016-10-23 21:10:25

标签: php arrays multidimensional-array

我需要通过搜索“底层”值来从多维数组中获取所有“顶级”键。以下是该数组的示例:

$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_searcharray_keysarray_column)来获取“第2册”的人来优化它,然后才运行foreach对于找到的人,但我没有运气获得“顶级”钥匙。

是否可以优化或使用内置函数来搜索多维数组?

2 个答案:

答案 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]