我基本上有一个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,因为它总是会成为产品的类别。
谢谢!
答案 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::xpath
docs来获取<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;
}
}
}