You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP:如何基于键值筛选数组并保留用户关联键值对

解决PHP数组筛选并保留指定键值对的问题

嘿,我明白你的需求了——你需要从包含完整用户数据的数组里,筛选出网页要展示的用户,同时只保留特定的键值对,而array_intersect_key()确实不适合这个场景,因为它是基于数组键的交集,而你是要基于某个字段的值来筛选。下面给你两种可行的方案,其中第二种更适合处理大量数据:

方案1:基础遍历筛选(适合小数据量)

首先我们先提取出需要展示的resourcesCode列表,然后遍历完整用户数组,筛选出符合条件的项并保留需要的键:

// 你的原始数组
$usersToShow = [
    'data' => [
        ['resourcesCode' => '1/ADS'],
        ['resourcesCode' => '1/AI']
    ]
];

$userArray = [
    'data' => [
        [
            'resourcesUuid' => '5B065639CEF911E3B45500505681619D',
            'resourcesTimestampModified' => 1445523359,
            'resourcesRecordVersionNumber' => 151,
            'resourcesCode' => '1/ADS',
            'resourcesName' => 'Ads de Sps'
        ],
        [
            'resourcesUuid' => '09D63BA70B045595B94B1663B4914162',
            'resourcesTimestampModified' => 1434377814,
            'resourcesRecordVersionNumber' => 3,
            'resourcesCode' => '1/AH',
            'resourcesName' => 'Alan Hastings'
        ],
        [
            'resourcesUuid' => '423C078A974F42654550E92C94EB3C5B',
            'resourcesTimestampModified' => 1472547682,
            'resourcesRecordVersionNumber' => 2,
            'resourcesCode' => '1/AI',
            'resourcesName' => 'Adam Iley'
        ]
    ]
];

// 提取需要展示的resourcesCode列表
$codesToShow = array_column($usersToShow['data'], 'resourcesCode');

$filteredData = [];
foreach ($userArray['data'] as $user) {
    // 检查当前用户是否在展示列表中
    if (in_array($user['resourcesCode'], $codesToShow)) {
        // 只保留需要的键值对
        $filteredData[] = [
            'resourcesCode' => $user['resourcesCode'],
            'resourcesName' => $user['resourcesName']
        ];
    }
}

// 整理成期望的格式
$result = ['data' => $filteredData];

// 输出结果
print_r($result);

方案2:优化查找效率(适合数百条数据的场景)

当数据量较大时,in_array()的查找效率会变低,我们可以把codesToShow转成键为resourcesCode的数组,用isset()来检查,这样查找速度会快很多:

// 提取并转成键为resourcesCode的数组
$codesToShow = array_flip(array_column($usersToShow['data'], 'resourcesCode'));

$filteredData = [];
foreach ($userArray['data'] as $user) {
    // 用isset检查键是否存在,效率更高
    if (isset($codesToShow[$user['resourcesCode']])) {
        $filteredData[] = [
            'resourcesCode' => $user['resourcesCode'],
            'resourcesName' => $user['resourcesName']
        ];
    }
}

$result = ['data' => $filteredData];
print_r($result);

运行上面的代码,都会得到你期望的结果:

Array
(
    [data] => Array
        (
            [0] => Array
                (
                    [resourcesCode] => 1/ADS
                    [resourcesName] => Ads de Sps
                )

            [1] => Array
                (
                    [resourcesCode] => 1/AI
                    [resourcesName] => Adam Iley
                )

        )

)

为什么不用array_intersect_key()?

array_intersect_key()是用来比较两个数组的键,返回键存在于两个数组中的项,但你的需求是基于字段值(resourcesCode)来筛选,同时还要保留指定的键,所以这个函数并不适用这个场景。遍历的方式更直接,也更容易控制要保留的键值对。

内容的提问来源于stack exchange,提问作者john

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 06:47:46