Как мне создать один массив из двух массивов, содержащих разные значения

#php #object #multidimensional-array #compare

#php #объект #многомерный массив #Сравнить

Вопрос:

У меня есть два массива, один с именем fetched_services и один с именем fetched_companies , они выглядят следующим образом:

fetched_services

 (
[1] => Array
    (
        [id] => 11
        [child_services] => Array
            (
                [0] => Array
                    (
                        [id] => 153
                    )

                [1] => Array
                    (
                        [id] => 137
                    )

                [2] => Array
                    (
                        [id] => 138
                    )
            )
    )
)
  

fetched_companies

 (
[0] => stdClass Object
    (
        [services] => Array
            (
                [0] => 25
                [1] => 102
            )
    )
)
  

Чего я хочу добиться, так это получить массив, подобный fetched_services , но имеющий только child_services идентификатор fetched_companies["services"] .

Что я пробовал, так это:

 $services = [];
$isFound = false;
foreach ($fetched_services as $fetched_service) {
  foreach ($fetched_service["child_services"] as $fetched_child_service) {
    $fetched_service["child_services"] = [];
    foreach ($fetched_companies as $fetched_company) {
      if( (in_array($fetched_child_service["id"],$fetched_company->services)) ) {
        $fetched_service["child_services"][] = $fetched_child_service;
        $isFound = true;
      }
    }
    if($isFound) {
      
      $services[] = $fetched_service;
      $isFound = false;
    }
  }
}
  

Это выводит это:

 Array
(
    [0] => Array
        (
            [id] => 11
            [child_services] => Array
                (
                    [0] => Array
                        (
                            [id] => 116
                        )

                )

        )

    [1] => Array
        (
            [id] => 11
            [child_services] => Array
                (
                    [0] => Array
                        (
                            [id] => 117
                        )

                )

        )

)
  

Как вы можете видеть, результирующий массив имеет два массива, содержащих одинаковый идентификатор, но child_services разные.

В итоге я хочу получить следующее:

 Array
(
    [0] => Array
        (
            [id] => 11
            [child_services] => Array
                (
                    [0] => Array
                        (
                            [id] => 116
                        )

                )
                (
                    [0] => Array
                        (
                            [id] => 117
                        )

                )

        )

)
  

Что я здесь делаю не так? Спасибо!

Комментарии:

1. Откуда ['id' => 11] берется результирующий массив? Вы сказали, что хотите массив, подобный fetched_services , но конечный результат, которым вы поделились, не имеет такой же структуры.

2. Я обновил свой вопрос, указав, где находится идентификатор. Спасибо! Это выглядит так $fetched_services = [ 'id' => 11, 'child_services' => [ ['id' => 25], ['id' => 137], ['id' => 102] ] ];

3. Спасибо, но все еще кое-что неясно: ваша $fetched_companies переменная выглядит как массив. Следует ли фильтровать дочерние службы с помощью всех служб, определенных в этом массиве? К чему относится ключ 0?

4. ДА. Я хочу проверить, содержат ли сервисы child_services[id], удалить child_services, если их id отсутствует в массиве services, и, наконец, восстановить массив fetched_service с помощью массива child_services. фух

5. Извините, но я не понимаю: вам придется привести наглядный пример ввода -> вывода, отредактировав свой вопрос.

Ответ №1:

Ваш вопрос немного неясен (я отредактирую / удалю это, если / когда вы уточните, см. Мой комментарий выше), Но вы, вероятно, могли бы использовать array_filter , сохраняя только службы, которые присутствуют в указанном списке (через in_array ):

 $result = array_filter(
  $fetched_services['child_services'],
  fn(array $child_service): bool => in_array($child_service['id'], $fetched_companies[0]->services, true)
);
  

ДЕМОНСТРАЦИЯ