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

3

给定以下二维数组:

$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”的组合,并且只有当该组合存在时才获取其索引?有比我想出来的更好的方法吗?

3个回答

6

您可以使用array_filter(),它允许您同时对内容进行多个检查...

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

这将给你一个匹配项列表,所以如果你只需要单个匹配项,可能需要使用 [0](并检查是否只返回了1个)。

4
你可以将搜索查询构建为一个数组,并比较每个项的交集。
$search = ['score' => '50', 'name' => 'Bob'];

foreach($data_info_array as $k => $v) {
    if ( $search === array_intersect($v, $search) ) {
        echo $k;
        break;
    }
}

@mickmackusa注意到在这里使用array_intersect_assoc()更安全。他是对的,因为当多维数组项不可预测时,可能会有像这样的项:
['miaou' => '50', 'graou' => 'Bob', 'score' => '50', 'name' => 'Bob']

在搜索值也存在但是对应其他键名的情况下,array_intersect()会返回所有正确的值(当然还有它们对应的键名),而不管在$search中是否具有相同的键名,与搜索数组进行比较会返回false
但是使用array_intersect_assoc(),可以确保只考虑$search中的键名所对应的值。
结论:如果你让自己被多维数组项的看似单调所迷惑,那么当出现意外变化时,你将不免受到surprise的影响。

使用array_intersect_assoc($search, $v)更安全,对吧 @Cas? - mickmackusa
@mickmackusa:你也可以使用array_intersect_assoc(),但不确定是否能获得更高效或更安全的结果,因为最终比较决定了项目是否存在,而没有正确的键,比较将返回false,无论交集中的值如何。 - Casimir et Hippolyte
@mickmackusa: 但我明白你的意思,像这样一个外来的项目:array_intersect(['50', 'Bob', 'score'=>'50', 'name'=>'Bob'],['score' => '50', 'name' => 'Bob']) - Casimir et Hippolyte

2

这是一个不错的一行代码,利用了PHP箭头函数。

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

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

print_r($result);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接