返回

如何在平面数组中基于特定列值过滤行?

php

从数组中提取特定行:基于平面数组中的列值的过滤

问题陈述

想象一下你有两个数组:$arr1 是一个包含多列(如 id、name、style、age、whim)的多行数组,而 $arr2 是一个包含一组 id 值的平面数组。你的目标是过滤 $arr1,只保留包含 $arr2 中 id 值的行。

解决方案

为了实现这个目标,我们使用 PHP 的 array_filter() 函数,它可以应用回调函数并过滤数组中的元素。回调函数检查 $arr1 中每一行的 id 值是否与 $arr2 中的值匹配,并将匹配的行返回到结果数组中。

以下是详细步骤:

  1. 定义回调函数:

    $filter_function = function ($row) use ($arr2) {
        return in_array($row['id'], $arr2);
    };
    
  2. 应用回调函数:

    $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() 等函数对数组进行过滤。