#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)
);