如何用PHP将多维数组转换为指定格式的多维数组
解决PHP多维数组结构转换问题
嘿,我来帮你搞定这个数组转换的事儿!你当前的代码有两个核心问题:一是用in_array判断嵌套数组是否存在并不靠谱(因为每次循环新建的$type都是独立的数组实例,哪怕name相同,in_array也会认为是不同元素);二是完全没处理data数组的填充逻辑。
下面给你一套清晰的实现方案,分两步走:
思路分析
先按type名称分组收集对应的数据,再把分组后的结构转换成你需要的格式,这样既高效又避免重复。
完整代码实现
针对原生数组的情况(你给出的$array)
$array = [ ['type 1', 'Country 1', 243], ['type 1', 'Country 2', 500], ['type 1', 'Country 3', 400], ['type 2', 'Country 1', 234], ['type 2', 'Country 2', 1234], ['type 2', 'Country 3', 1400], ['type 3', 'Country 1', 222], ['type 3', 'Country 2', 25], ['type 3', 'Country 3', 120], ]; // 第一步:用临时数组按type分组存储数据 $tempGroup = []; foreach ($array as $item) { $typeName = $item[0]; $country = $item[1]; $value = $item[2]; // 如果当前type还未初始化,先创建空数组 if (!isset($tempGroup[$typeName])) { $tempGroup[$typeName] = []; } // 将当前国家和数值整理成目标格式,加入对应type的列表 $tempGroup[$typeName][] = [ 'name' => $country, 'y' => $value ]; } // 第二步:将分组后的数组转换为你需要的最终结构 $toArray = []; foreach ($tempGroup as $typeName => $dataList) { $toArray[] = [ 'name' => $typeName, 'data' => $dataList ]; } // 打印验证结果 print_r($toArray);
针对数据库模型的情况(你的$models变量)
如果$models是Eloquent模型对象,只需要把数组索引换成模型字段名即可:
$tempGroup = []; foreach ($models as $model) { $typeName = $model->type; $country = $model->country; // 替换成你模型里的国家字段名 $value = $model->count; // 替换成你模型里的数值字段名 if (!isset($tempGroup[$typeName])) { $tempGroup[$typeName] = []; } $tempGroup[$typeName][] = [ 'name' => $country, 'y' => $value ]; } $toArray = []; foreach ($tempGroup as $typeName => $dataList) { $toArray[] = [ 'name' => $typeName, 'data' => $dataList ]; }
为什么这个方案可行?
- 用
type名称作为临时数组的键,能快速判断当前类型是否已经存在,避免了in_array的低效和不准确问题 - 先分组再转换的逻辑清晰,每一步只做一件事,后续维护也方便
- 时间复杂度是O(n),比嵌套循环或者多次遍历的效率更高
内容的提问来源于stack exchange,提问作者Arny
相关产品推荐
相关产品推荐

