如何在多维数组中获取唯一值并重新排列 PHP



我有一个类似于以下内容的数组:

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']
];
}

您的问题对要使用的标识符有点模棱两可。 我假设您想将idname用作双重标识符。 如果这不是真的,你应该澄清你的问题。 正如plumpNation所说,在发布问题时,您必须始终显示您的编码尝试。

无论哪种方式,您在 SO 上找到的最流行的技术都使用唯一的临时键,然后在循环后重新索引。 (Plump 的方法不会在循环后重新索引临时键。 我正在使用array_splice()implode()来使我的代码更干燥。

代码:(演示(

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

最新更新