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