通过对公用值进行分组将其转换为多维数组

问题描述 投票:0回答:1

编写具有以下签名的PHP函数(不知道是否有任何内置函数对此有所帮助)是最优雅的方法:

function group_arr($arr, ...$keys) {
  $result = $arr;
  // ...
  return $result;
};

所以,当我传递以下数组时:

$arr_src = [
  [ 'Country' => 'USA',     'State' => 'Florida',     'City' => 'Miami',        'Population' => 2744878,  'AreaSquareMile' => 55.25 ],
  [ 'Country' => 'USA',     'State' => 'Florida',     'City' => 'Tampa',        'Population' => 4300000,  'AreaSquareMile' => 175.2 ],
  [ 'Country' => 'USA',     'State' => 'Florida',     'City' => 'Orlando',      'Population' => 1923000,  'AreaSquareMile' => 113.7 ],
  [ 'Country' => 'USA',     'State' => 'California',  'City' => 'Los Angeles',  'Population' => 13100000, 'AreaSquareMile' => 503.0 ],
  [ 'Country' => 'USA',     'State' => 'California',  'City' => 'San Diego',    'Population' => 3231000,  'AreaSquareMile' => 372.4 ],
  [ 'Country' => 'Canada',  'State' => 'Ontario',     'City' => 'Toronto',      'Population' => 6139000,  'AreaSquareMile' => 243.3 ],
  [ 'Country' => 'Canada',  'State' => 'Quebec',      'City' => 'Montreal',     'Population' => 4196000,  'AreaSquareMile' => 166.6 ],
  [ 'Country' => 'Canada',  'State' => 'Quebec',      'City' => 'Sherbrooke',   'Population' => 161323,   'AreaSquareMile' => 141.7 ],
];

如此处:

$arr_dst = group_arr($arr_src, 'Country', 'State', 'City');

我得到以下结果:

$arr_dst = [
  'USA' => [
    'Florida' => [
      'Miami' => [
        'Population' => 2744878,
        'AreaSquareMile' => 55.25,
      ],
      'Tampa' => [
        'Population' => 4300000,
        'AreaSquareMile' => 175.2,
      ],
      'Orlando' => [
        'Population' => 1923000,
        'AreaSquareMile' => 113.,
      ],
    ],
    'California' => [
      'Los Angeles' => [
        'Population' => 13100000,
        'AreaSquareMile' => 503.0,
      ],
    ],
    'California' => [
      'San Diego' => [
        'Population' => 3231000,
        'AreaSquareMile' => 372.4,
      ],
    ],
  ],
  'Canada' => [
    'Ontario' => [
      'Toronto' => [
        'Population' => 6139000,
        'AreaSquareMile' => 243.3,
      ],
    ],
    'Quebec' => [
      'Montreal' => [
        'Population' => 4196000,
        'AreaSquareMile' => 166.6,
      ],
      'Sherbrooke' => [
        'Population' => 161323,
        'AreaSquareMile' => 141.7,
      ],
    ],
  ],
];

关于实现此目标的任何想法?

谢谢!

php sorting associative-array
1个回答
0
投票

好吧,我自己完成了功能,希望对其他人有所帮助:

function group_arr($arr, ...$keys) {
  if (!function_exists('extract_sub_array')) {
    function extract_sub_array($arr, $key, $value) {
      $result = [];
      for ($i = 0; $i < count($arr); $i++) {
        if ($arr[$i][$key] == $value) {
          $arr_aux = $arr[$i];
          unset($arr_aux[$key]);
          $result[] = $arr_aux;
        }
      }
      return $result;
    }
  }
  if (count($keys) === 0) {
    return $arr;
  }
  else {
    $result = [];
    $key = $keys[0];
    $values = array_unique(array_map(function($row) use ($key) { return $row[$key]; }, $arr));
    sort($values);
    for ($i = 0; $i < count($values); $i++) {
      $sub_arr = extract_sub_array($arr, $key, $values[$i]);
      $result[$values[$i]] = group_arr($sub_arr, ...array_slice($keys, 1));
    }
    return $result;
  }
};
© www.soinside.com 2019 - 2024. All rights reserved.