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

У меня есть два массива, второй многомерный. Я пытаюсь вернуть третий массив, в котором service_id в Array2 соответствует значениям в Array1.

Array1
(
    [0] => 158
    [1] => 162
)

Array2
(
    [localhost] => Array
        (
            [0] => Array
                (
                    [host_name] => localhost                        
                    [current_state] => 0                   
                    [service_id] => 158
                )

            [1] => Array
                (
                    [host_name] => localhost
                    [current_state] => 0                        
                    [service_id] => 159
                )
        )
    [192.168.0.43] => Array
        (
            [0] => Array
                (
                    [host_name] => 192.168.0.43                        
                    [current_state] => 0
                    [service_id] => 168
                )

            [1] => Array
                (
                    [host_name] => 192.168.0.43
                    [current_state] => 1
                    [service_id] => 162
                )
        )
)

Итак, Array3 должен быть:

Array3
(
    [localhost] => Array
        (
            [0] => Array
                (
                    [host_name] => localhost                        
                    [current_state] => 0                   
                    [service_id] => 158
                )

     [192.168.0.43] => Array
        (
            [0] => Array
                (
                    [host_name] => 192.168.0.43
                    [current_state] => 0                   
                    [service_id] => 162
                )
        )
)

Вот что у меня есть, но, похоже, он не фильтрует весь массив.

$Array3= array_filter($Array2, function ($value) use ($Array1) {
        return in_array(array_shift($value)['service_id'], $Array1);
});

Я здесь близко, что мне не хватает?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
0
40
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Итак, ниже должно быть то, что вам нужно для достижения $ Array3:

$Array3 = array(array($Array2[0][0], $Array2[0][1], $Array1[0]), array($Array2[1][0],
$Array2[1][1], $Array1[1]));

Однако, чтобы достичь этого более динамично, вам нужно использовать что-то вроде:

$Array3 = array();

for($i = 0; $i < $Array2[0].length; $i++){

array_push($Array3, array($Array2[$i][0], $Array2[$i][1], $Array1[$i]));

}

var_dump($Array3) // For debug only.
Ответ принят как подходящий

Я думаю, что из-за того, что вы хотите фильтровать на второй глубине, он должен пройти через первый уровень, а затем отфильтровать второй уровень (думаю, что это имеет смысл).

Таким образом, этот код использует array_map() для обхода уровня хоста массива (localhost и 192.168.0.43), а затем использует array_filter() внутри него. Придется использовать use() для передачи массива поиска на каждый уровень функции

$array3 = array_map(function($data) use ($Array1)
    { return array_filter($data, function($sub) use ($Array1)
        { return in_array($sub["service_id"], $Array1); });
}, $Array2);

print_r($array3);

печатает ...

Array
(
    [localhost] => Array
        (
            [0] => Array
                (
                    [host_name] => localhost
                    [current_state] => 0
                    [service_id] => 158
                )

        )

    [192.168.0.43] => Array
        (
            [1] => Array
                (
                    [host_name] => 192.168.0.43
                    [current_state] => 1
                    [service_id] => 162
                )

        )

)

Другие вопросы по теме