Использование array_filter для фильтрации многомерного массива

голоса
0

У меня есть два массива, второй многомерна. Я пытаюсь вернуть третий массив, где host_id в array2 соответствуют значениям в 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);
    });
}

Что мне не хватает?

Задан 07/11/2018 в 20:10
источник пользователем
На других языках...                            


1 ответов

голоса
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);

демонстрация

Обновить

Для обновленной структуры данных можно получить первый элемент из подрешетки с, например , сброс :

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

демонстрация

Ответил 07/11/2018 в 20:17
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more