使用array_filter过滤多维数组

时间:2018-11-07 20:10:13

标签: php arrays

我有两个数组,第二个是多维数组。我试图返回第三个数组,其中Array2中的host_id与Array1中的值匹配。

Array1 
(
    [0] => 146
    [1] => 173
)

Array2
(
    'localhost' => (
        '0' => (
            'host_id' => 146
        ),
    ),
    '192.168.0.43' => (
        '1' => (
            'host_id' => 160
        ),
    ),
    '192.168.0.38' => (
        '2' => (
            'host_id' => 173
        )
    )
)

因此Array3应该是:

    Array3
    (
        [localhost] => Array
            '0' => (
                'host_id' => 146
            ),

        [192.168.0.38] => Array
            '0' => (
                'host_id' => 173
            ),

    )

我已经尝试过了,但是只返回了最后一个匹配的host_id。

foreach ($Array1 as $value) {   

    $filtered_hosts = array_filter($Array2, function ($host) use ($value) {

        return in_array($host['host_id'], $host_id);
    });
}

我想念什么?

1 个答案:

答案 0 :(得分:3)

您可以只使用array_filter而不使用foreach

将第一个数组传递到use($array1),然后使用in_array检查'host_id'的值是否存在。

$array1 = [
  146,
  173
];

$array2 = [
    'localhost' => [
        'host_id' => 146
    ],
    '192.168.0.43' => [
        'host_id' => 160
    ],
    '192.168.0.38' => [
        'host_id' => 173
    ]
];

$filtered_hosts = array_filter($array2, function($x) use ($array1) {
    return in_array($x['host_id'], $array1);
});


print_r($filtered_hosts);

Demo

更新

对于更新后的数据结构,您可以使用例如reset从子数组中获得第一项:

$filtered_hosts = array_filter($array2, function ($x) use ($array1) {
    return in_array(reset($x)['host_id'], $array1);
});

Demo