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

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]) . ','; 

解决方案

你的现有代码已经支持回调函数处理字段值,直接利用这个特性就能实现需求,无需改动核心逻辑:

  1. 将$columns数组中INVENTORY的配置从字符串改为数组,第二个元素设为处理数值的回调函数
  2. 在回调函数中取出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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 17:10:10