多维数组转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);
关键说明:
- 循环遍历
devices数组:通过foreach循环逐个处理每个设备,确保每个设备都生成一行数据。 - 分离公共字段与设备专属字段:把所有设备共享的字段(比如application_id、edition)提前提取,避免重复取值,提升效率。
- 空值处理:继续使用
?? ''语法处理可能不存在的字段,避免出现PHP警告。 - $location变量:原代码中使用了两次
$location但未定义,你需要根据实际数据结构补充它的取值逻辑(比如是应用级别的字段还是设备级别的字段)。
这样修改后,你的CSV文件就会生成两行记录,分别对应node1和node2两个设备。
内容的提问来源于stack exchange,提问作者biggambino
相关产品推荐
相关产品推荐

