如何在平面数组中基于特定列值过滤行?
2024-03-20 00:56:55
从数组中提取特定行:基于平面数组中的列值的过滤
问题陈述
想象一下你有两个数组:$arr1
是一个包含多列(如 id、name、style、age、whim)的多行数组,而 $arr2
是一个包含一组 id 值的平面数组。你的目标是过滤 $arr1
,只保留包含 $arr2
中 id 值的行。
解决方案
为了实现这个目标,我们使用 PHP 的 array_filter()
函数,它可以应用回调函数并过滤数组中的元素。回调函数检查 $arr1
中每一行的 id 值是否与 $arr2
中的值匹配,并将匹配的行返回到结果数组中。
以下是详细步骤:
-
定义回调函数:
$filter_function = function ($row) use ($arr2) { return in_array($row['id'], $arr2); };
-
应用回调函数:
$resultingArray = array_filter($arr1, $filter_function);
$resultingArray
现在将只包含 $arr1
中 id 值与 $arr2
中的值匹配的行。
示例
考虑以下示例数组:
$arr1 = [
['id' => 14, 'name' => 'bob', 'style' => 'big', 'age' => 33, 'whim' => 'no'],
['id' => 72, 'name' => 'jill', 'style' => 'big', 'age' => 22, 'whim' => 'yes'],
['id' => 39, 'name' => 'sue', 'style' => 'yes', 'age' => 111, 'whim' => 'yes'],
['id' => 994, 'name' => 'lucy', 'style' => 'small', 'age' => 23, 'whim' => 'no'],
['id' => 15, 'name' => 'sis', 'style' => 'med', 'age' => 24, 'whim' => 'no'],
['id' => 16, 'name' => 'maj', 'style' => 'med', 'age' => 87, 'whim' => 'yes'],
['id' => 879, 'name' => 'Ike', 'style' => 'larg', 'age' => 56, 'whim' => 'no'],
['id' => 286, 'name' => 'Jed', 'style' => 'big', 'age' => 23, 'whim' => 'yes'],
];
$arr2 = [14, 72, 8790];
应用 array_filter()
后,$resultingArray
将包含以下行:
[
['id' => 14, 'name' => 'bob', 'style' => 'big', 'age' => 33, 'whim' => 'no'],
['id' => 72, 'name' => 'jill', 'style' => 'big', 'age' => 22, 'whim' => 'yes'],
['id' => 879, 'name' => 'Ike', 'style' => 'larg', 'age' => 56, 'whim' => 'no'],
]
结论
通过使用 array_filter()
函数和一个自定义回调函数,我们可以轻松高效地从 $arr1
中过滤出包含 $arr2
中 id 值的行。这种技术在数据处理任务中非常有用,因为它允许我们根据特定条件提取和操作数据集的特定部分。
常见问题解答
1. 什么情况下使用这种过滤技术?
这种技术可以用于从大数组中提取特定信息、创建子集或根据特定条件对数据进行分组。
2. 是否可以根据多个列进行过滤?
是的,回调函数可以根据多个列检查条件,从而实现更复杂的过滤。
3. 如何优化过滤性能?
为了优化性能,确保 $arr2
是一个有序数组,可以使用 array_search()
函数进行快速查找。
4. 是否可以将过滤应用于嵌套数组?
是的,array_filter()
可以递归地应用于嵌套数组,以过滤其中的元素。
5. 还有其他过滤数组的方法吗?
除了 array_filter()
,还可以使用 array_keys()
和 array_intersect()
等函数对数组进行过滤。