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

时间:2012-02-01 19:17:25

标签: php xml

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

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

web_category3是项目的类别,1和2是产品类别的父类别。问题是有些项目嵌套在2个类别之间......或者有时5.所以我需要找到一种方法让PHP抓住后面有最高编号的web_category,因为它总是会成为产品的类别。

谢谢!

2 个答案:

答案 0 :(得分:1)

@ 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文件中出现的{em>所有 <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

答案 1 :(得分:0)

假设你的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;
        }
    }
}