首页 > 解决方案 > 如何在保留兄弟键值对的同时基于键值与数组相交

问题描述

我有两个数组,第一个是我想在网页中显示的用户列表,第二个数组包括完整的用户列表以及与每个用户关联的一些数据。

我可以使用 php 函数使用第一个作为主列表轻松减少第二个数组中的用户列表array_intersect_key(),但这也删除了与网页中需要的每个用户关联的属性。

如何限制第二个列表并保留每个用户的键值对?

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

期望的结果

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

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

注意: - 第二个数组实际上包含 100 个用户,为简洁起见,我在这里展示了三个。

标签: phparrays

解决方案


您可以使用array_filter生成一个输出数组,该数组仅包含$userArrayresourcesCode值存在于的值$usersToShow

$resourcesToShow = array_column($usersToShow['data'], 'resourcesCode');
$users = array();
$users['data'] = array_filter($userArray['data'], function ($v) use ($resourcesToShow) { return in_array($v['resourcesCode'], $resourcesToShow); });
print_r($users);

输出:

Array
(
    [data] => Array
        (
            [0] => Array
                (
                    [resourcesUuid] => 5B065639CEF911E3B45500505681619D
                    [resourcesTimestampModified] => 1445523359
                    [resourcesRecordVersionNumber] => 151
                    [resourcesCode] => 1/ADS
                    [resourcesName] => AdsdeSps
                )

            [2] => Array
                (
                    [resourcesUuid] => 423C078A974F42654550E92C94EB3C5B
                    [resourcesTimestampModified] => 1472547682
                    [resourcesRecordVersionNumber] => 2
                    [resourcesCode] => 1/AI
                    [resourcesName] => AdamIley
                )

        )

)

3v4l.org 上的演示


推荐阅读