如何在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'])
。