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
相关产品推荐
相关产品推荐

