You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:28:42