У меня есть массив, похожий на:
Array
(
[0] => Array
(
[id] => 1
[name] => Allow all
[geo_group_id] => 1
[geo_location_id] => 5
[geo_name] => Afghanistan
)
[1] => Array
(
[id] => 1
[name] => Allow all
[geo_group_id] => 1
[geo_location_id] => 34
[geo_name] => Brazil
)
[2] => Array
(
[id] => 1
[name] => Allow all
[geo_group_id] => 1
[geo_location_id] => 52
[geo_name] => Costa Rica
)
[5] => Array
(
[id] => 2
[name] => Local Geo
[geo_group_id] => 2
[geo_location_id] => 108
[geo_name] => India
)
[6] => Array
(
[id] => 2
[name] => Local Geo
[geo_group_id] => 2
[geo_location_id] => 105
[geo_name] => Ireland
)
[7] => Array
(
[id] => 2
[name] => Local Geo
[geo_group_id] => 2
[geo_location_id] => 162
[geo_name] => Namibia
)
)
И хочу переставить массив как:
Array
(
[0] => Array
(
[id] => 1
[name] => Allow all
[geoLocation] => Array
(
[0] => Array
(
[geo_group_id] => 1
[geo_location_id] => 5
[geo_name] => Afghanistan
)
[1] => Array
(
[geo_group_id] => 1
[geo_location_id] => 34
[geo_name] => Brazil
)
[2] => Array
(
[geo_group_id] => 1
[geo_location_id] => 52
[geo_name] => Costa Rica
)
)
)
[1] => Array
(
[id] => 2
[name] => Local Geo
[geoLocation] => Array
(
[0] => Array
(
[geo_group_id] => 2
[geo_location_id] => 108
[geo_name] => India
)
[1] => Array
(
[geo_group_id] => 2
[geo_location_id] => 105
[geo_name] => Ireland
)
[2] => Array
(
[geo_group_id] => 2
[geo_location_id] => 162
[geo_name] => Namibia
)
)
)
)
любая помощь будет принята с благодарностью. Благодарю.
Кажется, это просто вопрос «делай мою работу для меня».
Это не красиво, но должно работать. Я не уверен, как объяснить это лучше, чем официальные документы для foreach
,
Я выбрал самое простое и удобочитаемое решение, чтобы вы могли увидеть, насколько простой может быть первая итерация вашего решения. Заставь это работать, сделай это красиво, сделай это быстро, в таком порядке.
<?php
$locations = [
[
'id' => 1,
'name' => 'Allow all',
'geo_group_id' => 1,
'geo_location_id' => 5,
'geo_name' => 'Afghanistan'
],
[
'id' => 1,
'name' => 'Allow all',
'geo_group_id' => 1,
'geo_location_id' => 34,
'geo_name' => 'Brazil'
],
[
'id' => 1,
'name' => 'Allow all',
'geo_group_id' => 1,
'geo_location_id' => 52,
'geo_name' => 'Costa Rica'
],
[
'id' => 2,
'name' => 'Local Geo',
'geo_group_id' => 2,
'geo_location_id' => 108,
'geo_name' => 'India'
],
[
'id' => 2,
'name' => 'Local Geo',
'geo_group_id' => 2,
'geo_location_id' => 105,
'geo_name' => 'Ireland'
],
[
'id' => 2,
'name' => 'Local Geo',
'geo_group_id' => 2,
'geo_location_id' => 162,
'geo_name' => 'Namibia'
]
];
$results = [];
foreach($locations as $location) {
$id = $location['id'];
if (!isset($results[$id])) {
$results[$id] = [
'id' => $id,
'name' => $location['name']
];
}
$results[$id]['geoLocation'][] = [
'geo_group_id' => $location['geo_group_id'],
'geo_location_id' => $location['geo_location_id'],
'geo_name' => $location['geo_name']
];
}
Ваш вопрос немного неоднозначен относительно идентификаторов, которые вы хотите использовать. Я собираюсь предположить, что вы хотите использовать id
а также name
в качестве двойных идентификаторов. Если это не так, вы должны уточнить свой вопрос. И как говорится в plumpNation, вы всегда должны показывать свои попытки кодирования при публикации вопроса.
В любом случае, самая популярная техника, которую вы найдете в SO, использует уникальные временные ключи, а затем переиндексирует после зацикливания. (метод plump не переиндексирует временные ключи после цикла.) Я использую array_splice()
а также implode()
сделать мой код DRYэ.
Код: (демонстрация)
foreach($locations as $a){
$keys=array_splice($a,0,2); // extract dual identifiers, reduce $a to geo_ elements
$k=implode($keys); // convert identifying elements to string for temp key
if(!isset($result[$k])){$result[$k]=$keys;} // store identifying elements via temp key
$result[$k]['geolocation'][]=$a; // store geo_ element via temp key
}
var_export(array_values($result)); // remove temp keys / re-index the array