📅  最后修改于: 2023-12-03 15:24:33.912000             🧑  作者: Mango
在PHP中,我们经常需要在一个数组中搜索指定值。数组函数array_search()
和in_array()
可以处理单一的搜索条件,但是当我们需要按多个键值进行搜索时,这些函数就不足以胜任了。在本篇文章中,我们将介绍如何在PHP数组中按多个键值进行搜索。
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
,表示这个元素应该保留到结果集中。
在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()
则需在每一次循环迭代中维护结果数组的状态,并在循环结束时返回最终结果。任何一种方法都可以胜任这项任务,取决于你对数组函数的个人喜好。