【问题标题】:xml foreach skipping over if statement in phpxml foreach 跳过 php 中的 if 语句
【发布时间】:2012-04-02 21:19:12
【问题描述】:

这就是我想要实现的目标。 我正在导入产品的 xml 文件(产品标签有一个 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,我看到的结果是这样的

标记 var_dump 结果:字符串(5)“开始” attrs var_dump 结果:object(SimpleXMLElement)#6 (1) { ["@attributes"]=> array(1) { ["id"]=> 字符串(1) "0" } } 0 (0)

flag var_dump 结果:object(SimpleXMLElement)#6 (1) { ["@attributes"]=> array(1) { ["id"]=> 字符串(1) "0" } }

attrs var_dump 结果:object(SimpleXMLElement)#5 (1) { ["@attributes"]=> array(1) { ["id"]=> 字符串(1) "0" } } 0 (0)

flag var_dump 结果:object(SimpleXMLElement)#5 (1) { ["@attributes"]=> array(1) { ["id"]=> 字符串(1) "0" } }

attrs var_dump 结果:object(SimpleXMLElement)#4 (1) { ["@attributes"]=> array(1) { ["id"]=> 字符串(1) "0" } } 1 (0)

flag var_dump 结果:object(SimpleXMLElement)#4 (1) { ["@attributes"]=> array(1) { ["id"]=> 字符串(1) "0" } }

attrs var_dump 结果:object(SimpleXMLElement)#8 (1) { ["@attributes"]=> array(1) { ["id"]=> 字符串(1) "1" } } 1 (1)

flag var_dump 结果:object(SimpleXMLElement)#8 (1) { ["@attributes"]=> array(1) { ["id"]=> 字符串(1) "1" } }

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

我试过 if( !is_array($flag) && $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]; 
    }
}
?>

【问题讨论】:

    标签: php if-statement foreach


    【解决方案1】:

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

    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>"; 
    }
    

    【讨论】:

    • 我将您的答案标记为正确答案,因为它准确地指导了我完成代码所需的位置。你是真棒淋浴喷头! :)
    • XPATH 非常接近。它适用于带来独特的类别;它唯一不做的是将产品 ID 分配给回显链接所需的 $attrs 变量。除此之外,这是一个干净的工作解决方案
    • er...别介意我的最后一条评论:P 我意识到生成 xml 文件的方式将适合我所做的,只需添加 $attrs=0;在 foreach 外面和 ++ 里面。一切都很完美! :)
    猜你喜欢
    • 1970-01-01
    • 2017-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多