如何在PHP中一次通过多个值搜索多维数组?

如何在PHP中一次通过多个值搜索多维数组?,php,arrays,multidimensional-array,filter,Php,Arrays,Multidimensional Array,Filter,给定以下二维阵列: $data_info_array = array( array( 'score' => '100', 'name' => 'Alice', 'subject' => 'Data Structures' ), array( 'score' => '50', 'name' => 'Bob', 'subject' => 'Advanced Algorithms'

给定以下二维阵列:

$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”分和“Bob”名,并仅在该组合存在的情况下获取该组合的索引?还有比我想出的更好的方法吗

您可以使用
array\u filter()
,它允许您同时对内容进行所需的检查

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

这将为您提供一个匹配项列表,因此如果需要单个匹配项,您可能需要执行
[0]
(并检查是否只返回1)。

您可以将搜索查询构建为一个数组,并将每个项的交集与之进行比较

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

foreach($data_info_array as $k => $v) {
    if ( $search === array_intersect($v, $search) ) {
        echo $k;
        break;
    }
}
@mickmackusa注意到在这里使用
array\u intersect\u assoc()
更安全。他是对的,因为当多维数组项不可预测时,没有什么东西禁止有这样的项:

['miaou' => '50', 'graou' => 'Bob', 'score' => '50', 'name' => 'Bob']
其中搜索的值也存在,但用于其他键。在这种情况下,
array\u intersect()
返回所有正确的值(当然还有它们相应的键),而不考虑
$search
中的键,与搜索数组的比较将返回
false

但是使用
array\u intersect\u assoc()
,可以确保只考虑
$search
中键的值


结论:如果多维数组项看起来很单调,让自己进入睡眠状态,那么当出现意外变化时,您将无法免疫。

这里有一个很好的单行程序,使用PHP箭头函数

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

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

print_r($result);

使用
array\u intersect\u assoc($search,$v)
,对不对@Cas?@mickmackusa:您也可以使用
array\u intersect\u assoc()
,但不确定您是否获得了更高效或更安全的内容,因为很好,比较决定了项目是否存在,并且没有正确的键,比较结果返回
false
不管交叉点中的值是什么。@mickmackusa:但我明白你的意思了:
array\u交叉点(['50',Bob',score'=>'50',name'=>'Bob'],['score'=>'50',name'=>'Bob'])