xml foreach在php中跳过if语句

时间:2012-04-02 21:19:12

标签: php if-statement foreach

这是我想要实现的目标。 我正在导入产品的xml文件(product标签有一个id属性:  举个例子。

我想要检索的产品标签中有1个标签(类别),但我只想要一个实例。所以我创建了一个标志来帮助区分产品ID何时发生变化。

我的代码看起来像这样

<?php 
$flag='start';
foreach($xml->product as $product)
{
    $attrs = $product->attributes();
echo "$attrs ($flag)"; // just used for testing results
if ($flag != $attrs) {
echo "| <a href='xmltest.php?menuitem=$attrs'>".$product->category." </a><br>"; 
$flag=$attrs;
}

}
?>

第一次运行时应该发生的是标志与attrs不匹配,链接被回显,标志现在与attrs匹配。

如果我有5个ID为1,1,2,2,2的产品标签,代码应该回显链接两次(首先是$ flag = start而$ attrs = 1,当$ flag = 1而$ ATTRS = 2)...

相反,它回应了所有5次,基本上忽略了if语句。

我无法看到if语句出错的地方。有人可以帮忙吗?

更新 感谢Showerhead,我一直在尝试你的建议,我比以前更接近。

我做了var_dump,我看到的结果看起来像这个

  

flag var_dump result:string(5)“start”   attrs var_dump result:object(SimpleXMLElement)#6(1){[“@attributes”] =&gt; array(1){   [ “ID”] =&GT; string(1)“0”}} 0(0)

     

flag var_dump result:object(SimpleXMLElement)#6(1){[“@attributes”] =&gt; array(1){   [ “ID”] =&GT; string(1)“0”}}

     

attrs var_dump result:object(SimpleXMLElement)#5(1){[“@attributes”] =&gt; array(1){   [ “ID”] =&GT; string(1)“0”}} 0(0)

     

flag var_dump result:object(SimpleXMLElement)#5(1){[“@attributes”] =&gt; array(1){   [ “ID”] =&GT; string(1)“0”}}

     

attrs var_dump result:object(SimpleXMLElement)#4(1){[“@attributes”] =&gt; array(1){   [ “ID”] =&GT; string(1)“0”}} 1(0)

     

flag var_dump result:object(SimpleXMLElement)#4(1){[“@attributes”] =&gt; array(1){   [ “ID”] =&GT; string(1)“0”}}

     

attrs var_dump result:object(SimpleXMLElement)#8(1){[“@attributes”] =&gt; array(1){   [ “ID”] =&GT; string(1)“1”}} 1(1)

     

flag var_dump result:object(SimpleXMLElement)#8(1){[“@attributes”] =&gt; array(1){   [ “ID”] =&GT; string(1)“1”}}

我现在明白$ flag var如何以字符串形式开始,然后采用数组的值。

我试过if(!is_array($ flag)&amp;&amp; $ flag!= $ attrs){但结果是一样的。

我是否有另一种方法可以使值相似以进行比较?

再次感谢,

更新

一个简单的爆炸帮助解决了它。这是适合我的代码。

<?php 
$flag='start';
foreach($xml->product as $product)
{
    $category = $product->category;
    $attrsvar = $product->attributes();
    $attrs = explode(" ", $attrsvar);

if( ! is_array($flag) && $flag != $attrs[0]) { 
echo " <a href='xmltest.php?menuitem=".$attrs[0]."'>".$category." </a> | "; 
$flag=$attrs[0]; 
    }
}
?>

1 个答案:

答案 0 :(得分:0)

您将要确保它首先不是数组。

if( ! is_array($flag) && $flag != $attrs) { etc... }

应该是它,对不起,如果你在我编辑它之前阅读第一篇文章。我完全误解了你的问题。现在这应该起作用的原因是因为你最初试图将一个数组与一个字符串进行比较,这可能会引发无声错误。

编辑:如果它仍然不起作用,请尝试使用var_dump()来确保两个变量在进行比较时是相同的类型。

更新:你知道吗,我们都在想这个。我将假设您正在使用此XML而不仅仅是获取类别,否则您可以查看下面更简单的XPATH解决方案。如果您正在使用此XML执行更多操作,则可以执行以下操作。

$products = array();
foreach($xml->product as $product) {
    $id = $product['id'];
    $category = $product->category;

    if( ! in_array($id, $products)) {
        $products[$id] = $category;
        echo "| <a href='xmltest.php?menuitem=$attrs'>".$category." </a><br>"; 

    }
}

XPATH,如果您只想使用类别。让我知道,如果我的XPATH不太正确,我在正常情况下对它不太好,我不想在睡眠不足的情况下我会多么糟糕。

$categories = $xml->xpath('//product/category');
$categories = array_unique($categories);
foreach($categories as $category) {
    echo "| <a href='xmltest.php?menuitem=$attrs'>".$category." </a><br>"; 
}