Как искать многомерный массив по нескольким значениям одновременно в PHP? - PullRequest
2 голосов
/ 05 марта 2020

Учитывая следующий 2D-массив:

$data_info_array = array( 
array( 
    'score'   => '100', 
    'name'    => 'Alice', 
    'subject' => 'Data Structures'
), 
array( 
    'score'   => '50', 
    'name'    => 'Bob', 
    'subject' => 'Advanced Algorithms'
), 
array( 
    'score'   => '75', 
    'name'    => 'Charlie', 
    'subject' => 'Distributed Computing'
) 
); 

// this gets the key when I search for the score of 50 from one column
$index = array_search('50', array_column($data_info_array, 'score')); 
echo $index; 

Если я хочу искать по двум значениям, я могу думать только о чем-то вроде:

 $index1 = array_search('50', array_column($data_info_array, 'score')); 
 $index2 = array_search('Bob', array_column($data_info_array, 'name')); 
 $real_index = ( $index1 === $index2 ) ? $index1 : null; 

Есть ли способ поиска для оценки '50' и имени 'Боба' вместе и получить индекс к этому, только если эта комбинация существует? Есть ли лучший способ сделать, чем я придумал?

Ответы [ 3 ]

2 голосов
/ 05 марта 2020

Вы можете построить свой поисковый запрос как массив и сравнить пересечение каждого элемента с ним.

$search = ['score' => '50', 'name' => 'Bob'];

foreach($data_info_array as $k => $v) {
    if ( $search === array_intersect($v, $search) ) {
        echo $k;
        break;
    }
}
1 голос
/ 05 марта 2020

Вот хороший однострочник, использующий PHP функции стрелок

$name = "Alice";
$score = "100";

$result = array_filter($data_info_array, fn($data) => $data['name'] == $name && $data['score'] == $score );

print_r($result);
1 голос
/ 05 марта 2020

Вы можете использовать array_filter(), что позволяет вам одновременно выполнять столько проверок содержимого, сколько вам нужно ...

$output = array_filter($data_info_array, function ($data) {
    return $data['score'] == 50 && $data['name'] == 'Bob';
});

Это даст вам список совпадений, поэтому вам может потребоваться сделать [0] (и проверить, возвращается ли только 1), если вам нужно одно совпадение.

...