как получить уникальное значение в многомерном массиве и переставить переполнение стека

У меня есть массив, похожий на:

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

)

)

)

)

любая помощь будет принята с благодарностью. Благодарю.

-2

Решение

Кажется, это просто вопрос «делай мою работу для меня».

Это не красиво, но должно работать. Я не уверен, как объяснить это лучше, чем официальные документы для 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']
];
}
1

Другие решения

Ваш вопрос немного неоднозначен относительно идентификаторов, которые вы хотите использовать. Я собираюсь предположить, что вы хотите использовать 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
0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector