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

多维数组转CSV:如何为嵌套数组生成多行CSV记录

问题:为多维数组中的每个设备生成独立CSV行

我正在处理如下多维数组:

Array ( 
    [0] => Array ( 
        [application_id] => 5234324 
        [edition] => Enterprise 
        [build_number] => 12.1.0.2.0 
        [product] => Array ( [vendor] => Oracle [name] => Oracle Database Server ) 
        [devices] => Array ( 
            [0] => Array ( 
                [device_id] => 432432 
                [host_name] => node1 
                [serial_number] => hs3423523d 
                [manufacturer] => HP 
                [model] => ProLiant DL380 Gen9 
                [last_scan] => 2018-04-27 11:39:51 
            ) 
            [1] => Array ( 
                [device_id] => 4ccf834b-43fa-4dd4-925a-9a3c96fadaf4 
                [host_name] => node2 
                [serial_number] => fdsgs35ed 
                [manufacturer] => HP 
                [model] => ProLiant DL380 Gen9 
                [last_scan] => 2018-04-27 08:24:08 
            ) 
        ) 
        [version] => 12c 
    ) 
)

我使用以下代码将数组整理后写入CSV文件:

$array = json_decode($result, true); 
$applicationid = $data['application_id']?? ''; 
$softwareedition = $data['edition']?? ''; 
$buildnumber = $data['build_number']?? ''; 
$hostname = $data['devices'][0]['host_name']?? ''; 
$applicationversion = $data['version']?? ''; 
$device_array = array($applicationid, $softwareedition, $buildnumber, $hostname,$location, $location, $lastscan, $applicationversion); 
$fp = fopen('file.csv', 'a'); 
fputcsv($fp, $device_array); 
fclose($fp);

当前代码仅能生成一行CSV记录:5234324,Enterprise,12.1.0.2.0,node1,12c,但数组中包含两个hostname,我需要为每个hostname生成一行CSV记录,即两行内容,请问该如何实现?我尝试过array_key_exists函数,但它不适用于多维数组,是否需要通过循环来处理?


解决方案

没错,你完全说对了——要实现每个设备对应一行CSV记录,必须通过循环遍历devices数组来处理。你的原代码只取了devices数组的第一个元素([0]),所以只会生成一行数据。下面是修改后的完整代码:

// 假设$array是你解析后的多维数组,先取出第一个应用条目(因为你的数组外层是[0]包裹的)
$data = $array[0]?? [];
if (empty($data['devices'])) {
    // 如果没有设备数据,直接退出
    exit;
}

// 提取所有设备共享的公共字段(这些字段在每行CSV中都相同)
$applicationId = $data['application_id']?? '';
$softwareEdition = $data['edition']?? '';
$buildNumber = $data['build_number']?? '';
$applicationVersion = $data['version']?? '';
// 注意:原代码中的$location变量未定义,这里假设你需要补充它的取值逻辑,比如从设备或其他地方获取
// $location = $data['location']?? ''; // 示例,根据实际情况调整

// 打开CSV文件(追加模式)
$fp = fopen('file.csv', 'a');

// 遍历每个设备,为每个设备生成一行CSV
foreach ($data['devices'] as $device) {
    // 提取当前设备的专属字段
    $hostname = $device['host_name']?? '';
    $lastScan = $device['last_scan']?? '';
    // 如果$location是每个设备的专属字段,就从$device中取:$location = $device['location']?? '';

    // 组装当前行的数组(注意调整字段顺序和$location的取值逻辑)
    $deviceRow = [
        $applicationId,
        $softwareEdition,
        $buildNumber,
        $hostname,
        $location, // 请确保这个变量已正确定义
        $location, // 原代码中重复了$location,根据实际需求调整
        $lastScan,
        $applicationVersion
    ];

    // 将当前行写入CSV
    fputcsv($fp, $deviceRow);
}

// 关闭文件句柄
fclose($fp);

关键说明:

  1. 循环遍历devices数组:通过foreach循环逐个处理每个设备,确保每个设备都生成一行数据。
  2. 分离公共字段与设备专属字段:把所有设备共享的字段(比如application_id、edition)提前提取,避免重复取值,提升效率。
  3. 空值处理:继续使用?? ''语法处理可能不存在的字段,避免出现PHP警告。
  4. $location变量:原代码中使用了两次$location但未定义,你需要根据实际数据结构补充它的取值逻辑(比如是应用级别的字段还是设备级别的字段)。

这样修改后,你的CSV文件就会生成两行记录,分别对应node1和node2两个设备。

内容的提问来源于stack exchange,提问作者biggambino

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:27:41