如何用PHP获取编号最高的XML项


How to snag highest numbered XML item with PHP?

我基本上有一个XML文件,里面装满了电子商务系统中使用的产品信息。我一直在创建一个脚本,将这些XML文件转换为.CSV,数据以电子商务系统可以处理的格式结构化(所以我不需要每次供应商提供新的XML文件时都复制/粘贴列)。每个产品的类别定义如下:

<web_category1>3</web_category1>
<web_category2>1</web_category2>
<web_category3>6</web_category3>

web_category3是商品的类别,1和2是产品类别的父类别。问题是有些项目嵌套在两个类别下。。或者有时为5。因此,我需要为PHP找到一种方法来获取后面数字最高的web_category,因为它总是产品的类别。

谢谢!

@ben的答案是正确的,但对我来说有点激烈。SimpleXMLElement对象很好,因为你可以很容易地将它们转换为数组。因此,一个更简单的解决方案是将其转换为数组,并使用max来确定生成的数组中的最高值:

$str = '
<item>
    <web_category1>3</web_category1>
    <web_category2>1</web_category2>
    <web_category3>6</web_category3>
</item>
';
$xml = new SimpleXMLElement($str);
echo max((array)$xml); // outputs: 6

更新

根据您下面的评论,让我们假设您需要获得所有出现在XML文件中的<item>元素的最大值,而不仅仅是一个(如上所述)。要处理此问题,您可以使用SimpleXMLElement::xpathdocs来获得<item>的所有出现的数组,然后在xpath结果的循环中执行相同的铸造技巧:

$str = '
<xml>
  <product1>
    <item>
      <web_category1>3</web_category1>
      <web_category2>1</web_category2>
      <web_category3>6</web_category3>
    </item>
  </product1>
  <product2>
    <item>
      <web_category4>17</web_category4>
      <web_category5>0</web_category5>
    </item>
  </product2>
</xml>
';
$xml = new SimpleXMLElement($str);
$allItems = array();
$items = $xml->xpath('//item');
foreach($items as $item) {
  $allItems = array_merge($allItems, (array)$item);
}
echo max($allItems); // outputs: 17

更新2

好吧,上次。如果这不是你想要做的,你至少应该有足够的例子来说明。考虑:

$str = '
<xml>
  <product1>
    <web_category1>3</web_category1>
    <web_category2>1</web_category2>
    <web_category3>6</web_category3>
  </product1>
  <product2>
    <web_category4>17</web_category4>
    <web_category5>0</web_category5>
  </product2>
  <product3>
    <web_category6>17</web_category6>
    <web_category7>21</web_category7>
  </product3>
</xml>
';
$xml = new SimpleXMLElement($str);
// assumes that product node names start with "product"
$products = $xml->xpath("//*[starts-with(name(),'product')]");
foreach ($products as $p) {
  $catNames = array_keys((array)$p);
  $catNums  = preg_replace("/[^'d]/", "", $catNames);
  echo $p->getName() . ' - highest category: ' . max($catNums) . "'n";
}

上述代码输出以下内容:

product1 - highest category: 3
product2 - highest category: 5
product3 - highest category: 7

假设您的XML是这样的:

<item>
    <web_category1>3</web_category1>
    <web_category2>1</web_category2>
    <web_category3>6</web_category3>
</item>

并且您有一个用于<item>的SimpleXMLElement对象,这应该可以做到:

$highest_web_category_number = -1;
$value_of_highest_web_category_number = -1;
foreach($item->getChildren() as $name => $data) {
    if(strpos($name, 'web_category') === 0) {
        $web_category_number = substr($name, strlen('web_category'));
        if($web_category_number > $highest_web_category_number) {
            $highest_web_category_number = $web_category_number
            $value_of_highest_web_category_number = $data;
        }
    }
}