Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 通过对公共值进行分组,将具有关联数组作为元素的索引数组转换为多维数组_Php_Sorting_Associative Array - Fatal编程技术网

Php 通过对公共值进行分组,将具有关联数组作为元素的索引数组转换为多维数组

Php 通过对公共值进行分组,将具有关联数组作为元素的索引数组转换为多维数组,php,sorting,associative-array,Php,Sorting,Associative Array,使用以下签名编写PHP函数(不知道是否有任何内置函数可以帮助实现此功能)最优雅的方式是什么: function group_arr($arr, ...$keys) { $result = $arr; // ... return $result; }; 因此,当我传入以下数组时: $arr_src = [ [ 'Country' => 'USA', 'State' => 'Florida', 'City' => 'Miami', '

使用以下签名编写
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,
      ],
    ],
  ],
];
你知道如何实现这一目标吗


谢谢

好的,我自己做了这个功能。希望它能帮助其他人:

/**
 * Convert indexed array with associative arrays as elements to multidimensional array by grouping common values
 * @param array   $arr    indexed array with associative arrays as elements.
 * @param array   $keys   list of keys to group by.
 * @return array  multidimensional array grouped by the provided keys.
 * @link https://stackoverflow.com/questions/60824438
 */
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[0];
  }
  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]);
      $next_keys = array_slice($keys, 1);
      $result[$values[$i]] = group_arr($sub_arr, ...$next_keys);
    }
    return $result;
  }
}
/**
*通过对公共值进行分组,将具有关联数组作为元素的索引数组转换为多维数组
*@param array$arr索引数组,关联数组作为元素。
*@param array$要分组的密钥列表。
*@return array按提供的键分组的多维数组。
*@linkhttps://stackoverflow.com/questions/60824438
*/
功能组\u arr($arr,…$keys)
{
如果(!function_存在('extract_sub_array')){
函数提取子数组($arr,$key,$value){
$result=[];
对于($i=0;$i