2012-04-02 92 views
1

这是我想要实现的。 我进口产品的XML文件(产品标签有一个id属性: 作为一个例子xml foreach跳过如果在php语句

还有就是我想检索产品标签内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 while $ attrs = 2)...

相反,它回声5次,基本上忽略if语句。

我看不到if语句出错的地方。谁能帮忙?

更新感谢花洒,我一直在努力您的建议,我比以前更近一点。

我做的var_dump,结果我看到这个样子的

标志的var_dump的结果:string(5) “开始” ATTRS的var_dump结果:对象(的SimpleXMLElement)#6(1){[ “@属性”] =>数组(1){ [ “ID”] =>串(1) “0”}} 0(0)

标志的var_dump结果:对象(的SimpleXMLElement)#6(1) {[“@attributes”] => array(1){ [“id”] => string(1)“0”}}

attrs var_dump result:object (0)

flag var_dump result:#5(1){[“@attributes”] =>数组(1){var id_dump结果:对象(SimpleXMLElement)#5(1){[“@attributes”] =>数组(1){ [“id”] => string(1)“0”}}

attrs var_dump result:object (0)

flag var_dump result:#4(1){[“@attributes”] =>数组(1){“id”] => string(1)“0”}} object(SimpleXMLElement)#4(1){[“@attributes”] => array(1){ [“id”] => string(1)“0”}}

attrs var_dump result:object(SimpleXMLElement)#8(1){[“@attributes”] => array(1){“id”] => string(1)“1”}} 1(1)

标志的var_dump结果:对象(的SimpleXMLElement)#8(1){[ “@属性”] =>数组(1){ [ “ID”] =>串(1) “1”}}

我现在明白了$ flag var作为一个字符串开始,然后采用数组的值。

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

有没有另一种方法可以让我的值比较类似?再次

感谢,

UPDATE

一个简单的爆炸帮助解决这个问题。这是为我工作的代码。

<?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]; 
    } 
} 
?> 

回答

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 for if you just want to use with categories。让我知道,如果我的XPATH不太正确,在正常情况下我不太好,我不想在睡眠不足的情况下,我可以多么糟糕地将它破坏。

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

如果我可以投票,我会。我还没有足够的代表 – 2012-04-03 14:53:24

+0

我将你标记为正确的答案,因为它确切地指导了我需要完成代码的位置。你真棒淋浴头! :) – 2012-04-03 15:16:13

+0

非常感谢,看看更多的想法:) – mseancole 2012-04-03 15:31:26