2017-08-12 59 views
-2

我有一个类似的数组:如何得到多维数组的独特价值和重新排列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 

         ) 

       ) 

     ) 

) 

任何帮助,将不胜感激。谢谢。

回答

1

这似乎只是一个'为我做我的工作'的问题。

这不是很漂亮,但它应该工作。我不知道如何解释它比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'] 
    ]; 
} 
0

你的问题有点含糊不清的,你要使用的标识符。我假设你想要使用idname作为双重标识符。如果不是这样,你应该澄清你的问题。正如丰满的说明,当发布问题时,您必须始终显示您的编码尝试。

无论哪种方式,您在SO上找到的最流行的技术都使用唯一的临时密钥,然后在循环后重新索引。 (丰满的方法不会在循环后重新索引临时密钥。)我使用array_splice()implode()来使我的代码DRY er。

代码:(Demo

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