📜  如何在PHP数组中按多个键 => 值进行搜索?(1)

📅  最后修改于: 2023-12-03 15:24:33.912000             🧑  作者: Mango

如何在PHP数组中按多个键值进行搜索?

在PHP中,我们经常需要在一个数组中搜索指定值。数组函数array_search()in_array()可以处理单一的搜索条件,但是当我们需要按多个键值进行搜索时,这些函数就不足以胜任了。在本篇文章中,我们将介绍如何在PHP数组中按多个键值进行搜索。

使用array_filter函数

PHP的array_filter()函数可以对数组中的元素进行过滤,并返回过滤后的元素。这个函数的第一个参数是要过滤的数组,我们可以定义一个匿名函数作为第二个参数,以此定义要搜索的多个键值对。

以下为一个示例:

$people = array(
    array('name' => 'Tom', 'age' => 23, 'gender' => 'M'),
    array('name' => 'Jane', 'age' => 25, 'gender' => 'F'),
    array('name' => 'Bob', 'age' => 20, 'gender' => 'M'),
    array('name' => 'Alice', 'age' => 27, 'gender' => 'F')
);

$search = array('name' => 'Alice', 'age' => 27);

$result = array_filter($people, function ($item) use ($search) {
    foreach ($search as $key => $value) {
        if (!isset($item[$key]) || $item[$key] != $value) {
            return false;
        }
    }
    return true;
});

print_r($result);

在上述代码中,我们首先定义了一个人物信息数组$people,其中包含了一些姓名、年龄和性别的信息。我们需要在这个数组中搜索名字为Alice,年龄为27的人员信息。

我们将要搜索的键值对$name => $value按数组的形式放置到$search变量中。我们在array_filter()函数中定义了一个匿名函数,该函数接收一个参数$item,代表当前正被遍历的数组元素。我们使用foreach()循环遍历多个搜索条件,并依次检查是否有任何一个条件无法匹配。如果发现了不匹配条件,则立即返回false,表示这个元素应该被过滤掉。如果遍历完成仍未发现任何不匹配的条件,则返回true,表示这个元素应该保留到结果集中。

使用array_reduce函数

在PHP中,函数array_reduce()可以将一个数组中的元素递归处理,并将这些元素最终归约为一个值。我们可以通过该函数实现在数组中按多个键值进行搜索。

以下为一个示例:

$people = array(
    array('name' => 'Tom', 'age' => 23, 'gender' => 'M'),
    array('name' => 'Jane', 'age' => 25, 'gender' => 'F'),
    array('name' => 'Bob', 'age' => 20, 'gender' => 'M'),
    array('name' => 'Alice', 'age' => 27, 'gender' => 'F')
);

$search = array('name' => 'Alice', 'age' => 27);

$result = array_reduce($people, function ($carry, $item) use ($search) {
    foreach ($search as $key => $value) {
        if (!isset($item[$key]) || $item[$key] != $value) {
            return $carry;
        }
    }
    $carry[] = $item;
    return $carry;
}, array());

print_r($result);

array_filter()类似,我们也需要定义一个匿名函数来处理array_reduce()函数的第二个参数。我们将使用array()作为最终结果的默认值,传递给array_reduce()函数的第三个参数。

函数内部使用foreach()循环遍历多个搜索条件,同样,如果发现了不匹配条件,则返回当前结果数组$carry(该数组最初为空)。如果所有搜索条件都能匹配,则将当前元素添加进结果数组中。

总结

我们已经学习了两种方法来在PHP数组中按多个键值进行搜索。这两种方法的主要区别在于回调函数的实现。使用array_filter()可以允许我们直接返回真值或假值,而array_reduce()则需在每一次循环迭代中维护结果数组的状态,并在循环结束时返回最终结果。任何一种方法都可以胜任这项任务,取决于你对数组函数的个人喜好。