2017-08-12 58 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