当前位置: 首页> 最新文章列表> 用 array_diff() + array_keys() 过滤多维数组中的键

用 array_diff() + array_keys() 过滤多维数组中的键

M66 2025-06-06

在 PHP 开发中,经常会遇到需要从多维数组中过滤掉某些特定键值的需求。本文将介绍如何结合 array_diff()array_keys() 两个函数,优雅高效地实现这一功能。

一、函数简介

  • array_keys()
    返回数组中所有的键名,支持指定键值过滤。

  • array_diff()
    计算两个(或更多)数组的差集,返回在第一个数组中但不在其它数组中的值。

通过这两个函数的结合使用,我们可以先拿到数组所有的键名,然后通过差集的方式排除掉不需要的键,最后重新生成过滤后的数组。

二、问题场景

假设有一个多维数组,结构如下:

$data = [
    [
        'id' => 1,
        'name' => 'Alice',
        'age' => 25,
        'city' => 'Beijing',
    ],
    [
        'id' => 2,
        'name' => 'Bob',
        'age' => 30,
        'city' => 'Shanghai',
    ],
];

我们想过滤掉每个子数组中的 agecity 字段,只保留 idname

三、实现代码

<?php

$data = [
    [
        'id' => 1,
        'name' => 'Alice',
        'age' => 25,
        'city' => 'Beijing',
    ],
    [
        'id' => 2,
        'name' => 'Bob',
        'age' => 30,
        'city' => 'Shanghai',
    ],
];

// 需要过滤掉的键名
$keysToRemove = ['age', 'city'];

$result = [];

foreach ($data as $item) {
    // 获取当前数组的所有键
    $keys = array_keys($item);
    
    // 计算需要保留的键,即 $keys 和 $keysToRemove 的差集
    $filteredKeys = array_diff($keys, $keysToRemove);
    
    // 利用保留的键重新构建子数组
    $filteredItem = [];
    foreach ($filteredKeys as $key) {
        $filteredItem[$key] = $item[$key];
    }
    
    $result[] = $filteredItem;
}

print_r($result);

代码解析:

  1. 通过 array_keys($item) 获取当前子数组所有的键名。

  2. array_diff() 计算出想保留的键,即原键集合减去要删除的键集合。

  3. 遍历过滤后的键名,重新组装新的数组。

  4. 最终 $result 就是过滤后的多维数组。

四、运行结果

Array
(
    [0] => Array
        (
            [id] => 1
            [name] => Alice
        )

    [1] => Array
        (
            [id] => 2
            [name] => Bob
        )
)

五、总结

通过 array_diff()array_keys() 的组合,我们能够快速、灵活地从多维数组中过滤掉指定的键值。此方法通用性强,适合处理各类复杂数组结构。若要过滤的键较多,或者数组层级更深,也可以封装成函数进行递归处理。