PHP XML转CSV:如何将负数库存值转换为0?
解决XML转CSV时INVENTORY负数转0的问题
我写了一段PHP代码,用SimpleXML读取stock.xml并转换为CSV文件,但XML中的INVENTORY字段存在负数,希望将这类负数转换为0,尝试了一段判断代码但未成功,请求帮助修改代码实现需求。
原代码
<?php function readRowsFromSimpleXML( SimpleXMLElement $element, string $rowExpression, array $columnExpressions ): Generator { foreach ($element->xpath($rowExpression) as $rowNode) { $row = []; foreach ($columnExpressions as $column => $options) { if (is_array($options)) { [$expression, $callback] = $options; } else { $expression = $options; $callback = null; } $values = $rowNode->xpath($expression); if ($callback) { $row[$column] = $callback($values); } else { $row[$column] = (string)($rowNode->xpath($expression)[0] ?? ''); } } yield $row; } } $rows = readRowsFromSimpleXML( simplexml_load_file('stock.xml'), '//Item', $columns = [ 'ITEMNUMBER' => './ITEMNUMBER', 'ITEMNAME' => './ITEMNAME', 'COLOR' => './COLOR', 'SIZE' => './SIZE', 'BRAND' => './BRAND', 'INVENTORY' => './INVENTORY', 'SALESPRICE' => './SALESPRICE', 'BARCODE' => './BARCODE' ] ); $fh = fopen('stm.csv', 'w'); fputcsv($fh, array_keys($columns)); foreach ($rows as $row) { fputcsv($fh, array_values($row)); } echo ('Export has been finished...'); ?>
尝试的未成功代码片段
if ($columns[6]<0) $columns[6] .= 0 ';'; else $columns[6] .= trim($columns[6]) . ',';
解决方案
你的现有代码已经支持回调函数处理字段值,直接利用这个特性就能实现需求,无需改动核心逻辑:
- 将
$columns数组中INVENTORY的配置从字符串改为数组,第二个元素设为处理数值的回调函数 - 在回调函数中取出XML节点的数值,判断若小于0则返回0,否则返回原数值
修改后的完整代码
<?php function readRowsFromSimpleXML( SimpleXMLElement $element, string $rowExpression, array $columnExpressions ): Generator { foreach ($element->xpath($rowExpression) as $rowNode) { $row = []; foreach ($columnExpressions as $column => $options) { if (is_array($options)) { [$expression, $callback] = $options; } else { $expression = $options; $callback = null; } $values = $rowNode->xpath($expression); if ($callback) { $row[$column] = $callback($values); } else { $row[$column] = (string)($rowNode->xpath($expression)[0] ?? ''); } } yield $row; } } $rows = readRowsFromSimpleXML( simplexml_load_file('stock.xml'), '//Item', $columns = [ 'ITEMNUMBER' => './ITEMNUMBER', 'ITEMNAME' => './ITEMNAME', 'COLOR' => './COLOR', 'SIZE' => './SIZE', 'BRAND' => './BRAND', 'INVENTORY' => [ './INVENTORY', function($values) { $value = (float)($values[0] ?? 0); return $value < 0 ? 0 : $value; } ], 'SALESPRICE' => './SALESPRICE', 'BARCODE' => './BARCODE' ] ); $fh = fopen('stm.csv', 'w'); fputcsv($fh, array_keys($columns)); foreach ($rows as $row) { fputcsv($fh, array_values($row)); } echo ('Export has been finished...'); ?>
关键说明
- 回调函数接收xpath查询返回的
$values数组,将第一个值转为浮点型(为空时默认0) - 通过三元运算符判断数值是否小于0,实现负数转0的逻辑
- 这种方式完全适配现有代码架构,后续其他字段需要特殊处理时,也可以用同样的方式添加回调
内容的提问来源于stack exchange,提问作者Dominik Naczk
相关产品推荐
相关产品推荐

