编写具有以下签名的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;
}
}