for循环造成的无限加载等待

问题描述:

我正在写一个PHP脚本,包含以下for循环:for循环造成的无限加载等待

for($x=count($content->data->parameters[0]->weather->children());$content->data->weather->{"weather-conditions"}[$x]['weather-type']==NULL;--$x){ 
    echo $x."\n"; 
} 

其中$含量的SimpleXMLElement,已解析XML类似下面的一个实例:

<dwml xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.0" xsi:noNamespaceSchemaLocation="http://graphical.weather.gov/xml/DWMLgen/schema/DWML.xsd"> 
<data> 
<parameters applicable-location="point1"> 
<location> 
<weather time-layout="k-p3h-n41-3"> 
<name>Weather Type, Coverage, and Intensity</name> 
<weather-conditions> 
<value coverage="slight chance" intensity="light" weather-type="snow" qualifier="none"> 
<visibility xsi:nil="true"/> 
</value> 
</weather-conditions> 
<weather-conditions> 
<value coverage="slight chance" intensity="light" weather-type="snow" qualifier="none"> 
<visibility xsi:nil="true"/> 
</value> 
</weather-conditions> 
<weather-conditions> 
<value coverage="chance" intensity="light" weather-type="snow" qualifier="none"> 
<visibility xsi:nil="true"/> 
</value> 
</weather-conditions> 
<weather-conditions> 
<value coverage="likely" intensity="light" weather-type="snow" qualifier="none"> 
<visibility xsi:nil="true"/> 
</value> 
</weather-conditions> 
<weather-conditions> 
<value coverage="definitely" intensity="light" weather-type="snow" qualifier="none"> 
<visibility xsi:nil="true"/> 
</value> 
</weather-conditions> 
<weather-conditions> 
<value coverage="definitely" intensity="light" weather-type="snow" qualifier="none"> 
<visibility xsi:nil="true"/> 
</value> 
</weather-conditions> 
<weather-conditions> 
<value coverage="definitely" intensity="moderate" weather-type="snow" qualifier="none"> 
<visibility xsi:nil="true"/> 
</value> 
<value coverage="areas" intensity="none" additive="and" weather-type="blowing snow" qualifier="none"> 
<visibility xsi:nil="true"/> 
</value> 
</weather-conditions> 
<weather-conditions> 
<value coverage="definitely" intensity="moderate" weather-type="snow" qualifier="none"> 
<visibility xsi:nil="true"/> 
</value> 
<value coverage="areas" intensity="none" additive="and" weather-type="blowing snow" qualifier="none"> 
<visibility xsi:nil="true"/> 
</value> 
</weather-conditions> 
<weather-conditions> 
<value coverage="definitely" intensity="moderate" weather-type="snow" qualifier="none"> 
<visibility xsi:nil="true"/> 
</value> 
<value coverage="areas" intensity="none" additive="and" weather-type="blowing snow" qualifier="none"> 
<visibility xsi:nil="true"/> 
</value> 
</weather-conditions> 
<weather-conditions> 
<value coverage="definitely" intensity="moderate" weather-type="snow" qualifier="none"> 
<visibility xsi:nil="true"/> 
</value> 
<value coverage="areas" intensity="none" additive="and" weather-type="blowing snow" qualifier="none"> 
<visibility xsi:nil="true"/> 
</value> 
</weather-conditions> 
<weather-conditions> 
<value coverage="chance" intensity="light" weather-type="snow" qualifier="none"> 
<visibility xsi:nil="true"/> 
</value> 
<value coverage="areas" intensity="none" additive="and" weather-type="blowing snow" qualifier="none"> 
<visibility xsi:nil="true"/> 
</value> 
</weather-conditions> 
<weather-conditions> 
<value coverage="chance" intensity="light" weather-type="snow" qualifier="none"> 
<visibility xsi:nil="true"/> 
</value> 
<value coverage="areas" intensity="none" additive="and" weather-type="blowing snow" qualifier="none"> 
<visibility xsi:nil="true"/> 
</value> 
</weather-conditions> 
<weather-conditions> 
<value coverage="slight chance" intensity="light" weather-type="snow showers" qualifier="none"> 
<visibility xsi:nil="true"/> 
</value> 
</weather-conditions> 
<weather-conditions> 
<value coverage="slight chance" intensity="light" weather-type="snow showers" qualifier="none"> 
<visibility xsi:nil="true"/> 
</value> 
</weather-conditions> 
<weather-conditions> 
<value coverage="slight chance" intensity="light" weather-type="snow showers" qualifier="none"> 
<visibility xsi:nil="true"/> 
</value> 
</weather-conditions> 
<weather-conditions> 
<value coverage="slight chance" intensity="light" weather-type="snow showers" qualifier="none"> 
<visibility xsi:nil="true"/> 
</value> 
</weather-conditions> 
<weather-conditions/> 
<weather-conditions/> 
<weather-conditions/> 
<weather-conditions/> 
<weather-conditions/> 
<weather-conditions/> 
<weather-conditions/> 
<weather-conditions/> 
<weather-conditions/> 
<weather-conditions/> 
<weather-conditions/> 
<weather-conditions/> 
<weather-conditions/> 
<weather-conditions/> 
<weather-conditions> 
<value coverage="slight chance" intensity="light" weather-type="rain" qualifier="none"> 
<visibility xsi:nil="true"/> 
</value> 
</weather-conditions> 
<weather-conditions> 
<value coverage="slight chance" intensity="light" weather-type="rain" qualifier="none"> 
<visibility xsi:nil="true"/> 
</value> 
</weather-conditions> 
<weather-conditions> 
<value coverage="slight chance" intensity="light" weather-type="rain" qualifier="none"> 
<visibility xsi:nil="true"/> 
</value> 
<value coverage="slight chance" intensity="light" additive="and" weather-type="snow" qualifier="none"> 
<visibility xsi:nil="true"/> 
</value> 
</weather-conditions> 
<weather-conditions> 
<value coverage="slight chance" intensity="light" weather-type="rain" qualifier="none"> 
<visibility xsi:nil="true"/> 
</value> 
<value coverage="slight chance" intensity="light" additive="and" weather-type="snow" qualifier="none"> 
<visibility xsi:nil="true"/> 
</value> 
</weather-conditions> 
<weather-conditions> 
<value coverage="slight chance" intensity="light" weather-type="rain" qualifier="none"> 
<visibility xsi:nil="true"/> 
</value> 
</weather-conditions> 
<weather-conditions> 
<value coverage="slight chance" intensity="light" weather-type="rain" qualifier="none"> 
<visibility xsi:nil="true"/> 
</value> 
</weather-conditions> 
<weather-conditions> 
<value coverage="chance" intensity="light" weather-type="rain" qualifier="none"> 
<visibility xsi:nil="true"/> 
</value> 
<value coverage="chance" intensity="light" additive="and" weather-type="snow" qualifier="none"> 
<visibility xsi:nil="true"/> 
</value> 
</weather-conditions> 
<weather-conditions> 
<value coverage="chance" intensity="light" weather-type="rain" qualifier="none"> 
<visibility xsi:nil="true"/> 
</value> 
<value coverage="chance" intensity="light" additive="and" weather-type="snow" qualifier="none"> 
<visibility xsi:nil="true"/> 
</value> 
</weather-conditions> 
<weather-conditions> 
<value coverage="chance" intensity="light" weather-type="rain" qualifier="none"> 
<visibility xsi:nil="true"/> 
</value> 
</weather-conditions> 
<weather-conditions> 
<value coverage="chance" intensity="light" weather-type="rain" qualifier="none"> 
<visibility xsi:nil="true"/> 
</value> 
</weather-conditions> 
<weather-conditions> 
<value coverage="chance" intensity="light" weather-type="rain" qualifier="none"> 
<visibility xsi:nil="true"/> 
</value> 
<value coverage="chance" intensity="light" additive="and" weather-type="snow" qualifier="none"> 
<visibility xsi:nil="true"/> 
</value> 
</weather-conditions> 
</weather> 
</parameters> 
</data> 
</dwml> 

编辑:解析该文件后,这是var_dump($content->data->parameters[0]->weather);产量:

object(SimpleXMLElement)#4 (3) { 
    ["@attributes"]=> 
    array(1) { 
    ["time-layout"]=> 
    string(11) "k-p3h-n41-3" 
    } 
    ["name"]=> 
    string(37) "Weather Type, Coverage, and Intensity" 
    ["weather-conditions"]=> 
    array(41) { 
    [0]=> 
    object(SimpleXMLElement)#2 (1) { 
     ["value"]=> 
     object(SimpleXMLElement)#45 (2) { 
     ["@attributes"]=> 
     array(4) { 
      ["coverage"]=> 
      string(13) "slight chance" 
      ["intensity"]=> 
      string(5) "light" 
      ["weather-type"]=> 
      string(4) "snow" 
      ["qualifier"]=> 
      string(4) "none" 
     } 
     ["visibility"]=> 
     object(SimpleXMLElement)#46 (0) { 
     } 
     } 
    } 
    [1]=> 
    object(SimpleXMLElement)#5 (1) { 
     ["value"]=> 
     object(SimpleXMLElement)#45 (2) { 
     ["@attributes"]=> 
     array(4) { 
      ["coverage"]=> 
      string(13) "slight chance" 
      ["intensity"]=> 
      string(5) "light" 
      ["weather-type"]=> 
      string(4) "snow" 
      ["qualifier"]=> 
      string(4) "none" 
     } 
     ["visibility"]=> 
     object(SimpleXMLElement)#46 (0) { 
     } 
     } 
    } 
    [2]=> 
    object(SimpleXMLElement)#6 (1) { 
     ["value"]=> 
     object(SimpleXMLElement)#45 (2) { 
     ["@attributes"]=> 
     array(4) { 
      ["coverage"]=> 
      string(6) "chance" 
      ["intensity"]=> 
      string(5) "light" 
      ["weather-type"]=> 
      string(4) "snow" 
      ["qualifier"]=> 
      string(4) "none" 
     } 
     ["visibility"]=> 
     object(SimpleXMLElement)#46 (0) { 
     } 
     } 
    } 
    [3]=> 
    object(SimpleXMLElement)#7 (1) { 
     ["value"]=> 
     object(SimpleXMLElement)#45 (2) { 
     ["@attributes"]=> 
     array(4) { 
      ["coverage"]=> 
      string(6) "likely" 
      ["intensity"]=> 
      string(5) "light" 
      ["weather-type"]=> 
      string(4) "snow" 
      ["qualifier"]=> 
      string(4) "none" 
     } 
     ["visibility"]=> 
     object(SimpleXMLElement)#46 (0) { 
     } 
     } 
    } 
    [4]=> 
    object(SimpleXMLElement)#8 (1) { 
     ["value"]=> 
     object(SimpleXMLElement)#45 (2) { 
     ["@attributes"]=> 
     array(4) { 
      ["coverage"]=> 
      string(10) "definitely" 
      ["intensity"]=> 
      string(5) "light" 
      ["weather-type"]=> 
      string(4) "snow" 
      ["qualifier"]=> 
      string(4) "none" 
     } 
     ["visibility"]=> 
     object(SimpleXMLElement)#46 (0) { 
     } 
     } 
    } 
    [5]=> 
    object(SimpleXMLElement)#9 (1) { 
     ["value"]=> 
     object(SimpleXMLElement)#45 (2) { 
     ["@attributes"]=> 
     array(4) { 
      ["coverage"]=> 
      string(10) "definitely" 
      ["intensity"]=> 
      string(5) "light" 
      ["weather-type"]=> 
      string(4) "snow" 
      ["qualifier"]=> 
      string(4) "none" 
     } 
     ["visibility"]=> 
     object(SimpleXMLElement)#46 (0) { 
     } 
     } 
    } 
    [6]=> 
    object(SimpleXMLElement)#10 (1) { 
     ["value"]=> 
     array(2) { 
     [0]=> 
     object(SimpleXMLElement)#45 (2) { 
      ["@attributes"]=> 
      array(4) { 
      ["coverage"]=> 
      string(10) "definitely" 
      ["intensity"]=> 
      string(8) "moderate" 
      ["weather-type"]=> 
      string(4) "snow" 
      ["qualifier"]=> 
      string(4) "none" 
      } 
      ["visibility"]=> 
      object(SimpleXMLElement)#47 (0) { 
      } 
     } 
     [1]=> 
     object(SimpleXMLElement)#46 (2) { 
      ["@attributes"]=> 
      array(5) { 
      ["coverage"]=> 
      string(5) "areas" 
      ["intensity"]=> 
      string(4) "none" 
      ["additive"]=> 
      string(3) "and" 
      ["weather-type"]=> 
      string(12) "blowing snow" 
      ["qualifier"]=> 
      string(4) "none" 
      } 
      ["visibility"]=> 
      object(SimpleXMLElement)#47 (0) { 
      } 
     } 
     } 
    } 
    [7]=> 
    object(SimpleXMLElement)#11 (1) { 
     ["value"]=> 
     array(2) { 
     [0]=> 
     object(SimpleXMLElement)#46 (2) { 
      ["@attributes"]=> 
      array(4) { 
      ["coverage"]=> 
      string(10) "definitely" 
      ["intensity"]=> 
      string(8) "moderate" 
      ["weather-type"]=> 
      string(4) "snow" 
      ["qualifier"]=> 
      string(4) "none" 
      } 
      ["visibility"]=> 
      object(SimpleXMLElement)#47 (0) { 
      } 
     } 
     [1]=> 
     object(SimpleXMLElement)#45 (2) { 
      ["@attributes"]=> 
      array(5) { 
      ["coverage"]=> 
      string(5) "areas" 
      ["intensity"]=> 
      string(4) "none" 
      ["additive"]=> 
      string(3) "and" 
      ["weather-type"]=> 
      string(12) "blowing snow" 
      ["qualifier"]=> 
      string(4) "none" 
      } 
      ["visibility"]=> 
      object(SimpleXMLElement)#47 (0) { 
      } 
     } 
     } 
    } 
    [8]=> 
    object(SimpleXMLElement)#12 (1) { 
     ["value"]=> 
     array(2) { 
     [0]=> 
     object(SimpleXMLElement)#45 (2) { 
      ["@attributes"]=> 
      array(4) { 
      ["coverage"]=> 
      string(10) "definitely" 
      ["intensity"]=> 
      string(8) "moderate" 
      ["weather-type"]=> 
      string(4) "snow" 
      ["qualifier"]=> 
      string(4) "none" 
      } 
      ["visibility"]=> 
      object(SimpleXMLElement)#47 (0) { 
      } 
     } 
     [1]=> 
     object(SimpleXMLElement)#46 (2) { 
      ["@attributes"]=> 
      array(5) { 
      ["coverage"]=> 
      string(5) "areas" 
      ["intensity"]=> 
      string(4) "none" 
      ["additive"]=> 
      string(3) "and" 
      ["weather-type"]=> 
      string(12) "blowing snow" 
      ["qualifier"]=> 
      string(4) "none" 
      } 
      ["visibility"]=> 
      object(SimpleXMLElement)#47 (0) { 
      } 
     } 
     } 
    } 
    [9]=> 
    object(SimpleXMLElement)#13 (1) { 
     ["value"]=> 
     array(2) { 
     [0]=> 
     object(SimpleXMLElement)#46 (2) { 
      ["@attributes"]=> 
      array(4) { 
      ["coverage"]=> 
      string(10) "definitely" 
      ["intensity"]=> 
      string(8) "moderate" 
      ["weather-type"]=> 
      string(4) "snow" 
      ["qualifier"]=> 
      string(4) "none" 
      } 
      ["visibility"]=> 
      object(SimpleXMLElement)#47 (0) { 
      } 
     } 
     [1]=> 
     object(SimpleXMLElement)#45 (2) { 
      ["@attributes"]=> 
      array(5) { 
      ["coverage"]=> 
      string(5) "areas" 
      ["intensity"]=> 
      string(4) "none" 
      ["additive"]=> 
      string(3) "and" 
      ["weather-type"]=> 
      string(12) "blowing snow" 
      ["qualifier"]=> 
      string(4) "none" 
      } 
      ["visibility"]=> 
      object(SimpleXMLElement)#47 (0) { 
      } 
     } 
     } 
    } 
    [10]=> 
    object(SimpleXMLElement)#14 (1) { 
     ["value"]=> 
     array(2) { 
     [0]=> 
     object(SimpleXMLElement)#45 (2) { 
      ["@attributes"]=> 
      array(4) { 
      ["coverage"]=> 
      string(6) "chance" 
      ["intensity"]=> 
      string(5) "light" 
      ["weather-type"]=> 
      string(4) "snow" 
      ["qualifier"]=> 
      string(4) "none" 
      } 
      ["visibility"]=> 
      object(SimpleXMLElement)#47 (0) { 
      } 
     } 
     [1]=> 
     object(SimpleXMLElement)#46 (2) { 
      ["@attributes"]=> 
      array(5) { 
      ["coverage"]=> 
      string(5) "areas" 
      ["intensity"]=> 
      string(4) "none" 
      ["additive"]=> 
      string(3) "and" 
      ["weather-type"]=> 
      string(12) "blowing snow" 
      ["qualifier"]=> 
      string(4) "none" 
      } 
      ["visibility"]=> 
      object(SimpleXMLElement)#47 (0) { 
      } 
     } 
     } 
    } 
...//More in here, trivial. 
    [40]=> 
    object(SimpleXMLElement)#44 (1) { 
     ["value"]=> 
     array(2) { 
     [0]=> 
     object(SimpleXMLElement)#45 (2) { 
      ["@attributes"]=> 
      array(4) { 
      ["coverage"]=> 
      string(6) "chance" 
      ["intensity"]=> 
      string(5) "light" 
      ["weather-type"]=> 
      string(4) "rain" 
      ["qualifier"]=> 
      string(4) "none" 
      } 
      ["visibility"]=> 
      object(SimpleXMLElement)#47 (0) { 
      } 
     } 
     [1]=> 
     object(SimpleXMLElement)#46 (2) { 
      ["@attributes"]=> 
      array(5) { 
      ["coverage"]=> 
      string(6) "chance" 
      ["intensity"]=> 
      string(5) "light" 
      ["additive"]=> 
      string(3) "and" 
      ["weather-type"]=> 
      string(4) "snow" 
      ["qualifier"]=> 
      string(4) "none" 
      } 
      ["visibility"]=> 
      object(SimpleXMLElement)#47 (0) { 
      } 
     } 
     } 
    } 
    } 
} 

由于最后的元素有时会是空的,而且我想要最新的非空天气项目,所以我将x设置为天气数组中最后一项的索引,并尝试向后工作,但页面不会“ t加载,并且在错误日志中没有任何内容。 编辑:我已经改变了方法,这企图使之更易于理解:

for($x=0; $content->data->parameters[0]->weather->{"weather-conditions"}[count($content->data->parameters[0]->weather->children())-$x]['weather-type']==NULL; $x++){ 
    echo $x."\n"; 
} 

编辑:如果它是不明确的,我需要通过孩子的阵列向后递归,不转发。

+0

请问为什么你不只是使用foreach呢? – 2013-03-04 23:36:46

+0

因为使用此方法通过子节点向后递归似乎更容易。 – Aehmlo 2013-03-04 23:37:40

+0

如果您需要向后遍历数组,为什么不使用'array_reverse'来反转数组,并像正常一样循环它呢? – Axel 2013-03-04 23:56:36

我能找到你的问题的一些各种问题:

的XML是无效的。请在提问时提供工作数据,此处<location>元素已打开且从未关闭。我的答案的其余部分的前提条件是,此开始标记已被删除删除了

无法循环无法阻止。$x低于0毫无意义,但你不检查。您应该添加这样的检查,这样你不只是创造一个无限循环,因为你用break决策逻辑的另一部分做了一些错误:

for (
    $x = count($content->data->parameters[0]->weather->children()); 
    $x >= 0 && $content->data->weather->{"weather-conditions"}[$x]['weather-type'] == NULL; 
    --$x 
) { 
    echo $x . "\n"; 
} 

随着(固定的)比如现在这个数据会从42减到0但不小于0.至少无限循环已被删除。清理出这些技术问题后,然后你可以专注于问题域:

由于在最后的元素,有时会是空的,我想要最新的非空天气项目

好,您的实际示例XML不包含任何元素<weather>(即是没有任何孩子<weather>元素。因此,它是你问不清楚是什么。

但是它包含空<weather-conditions/>的Elemen因此作为我采取的其他答案的先决条件。

XML没有特定的顺序 - 至少不是设计 - 并且如您的示例XML所示,空的<weather-conditions/>元素更多位于文档中间,而不是最后。你真正需要的是所有包含子元素的<weather-conditions>元素(这里是<value>)。你用xpath查询来做到最好。

所以你首先查询所有的元素<value>孩子,然后你拿最后一个元素(以文档的顺序)。所以在这里,我们去:

list($lastCondition) = $content->xpath(' 
    (
     /*/data/parameters/weather/weather-conditions[value] 
    )[position() = last()] 
'); 

变量$lastCondition则包含了最后一个非空元素,这里根据你的示例XML XML输出:

<weather-conditions> 
        <value coverage="chance" intensity="light" weather-type="rain" qualifier="none"> 
         <visibility xsi:nil="true"/> 
        </value> 
        <value coverage="chance" intensity="light" additive="and" weather-type="snow" qualifier="none"> 
         <visibility xsi:nil="true"/> 
        </value> 
       </weather-conditions> 

正如你可以看到有很多的事情不清楚,你的问题很难回答。最后,我希望这仍然有帮助。

使用的方法是SimpleXMLElement::xpath(),在W3C站点XML Path Language (XPath) Version 1.0上指定了Xpath 1.0(由该方法使用),*本身包含很多示例,所以首先在此处搜索始终是一个不错的选择。

事实证明,我跳过了几层关系,这就是为什么检查字符串是否为NULL的条件总是返回TRUE(因此是无限循环)。最终代码:

for($x=count($content->data->parameters[0]->weather->children()); $x>0; $x--){ 
    if($content->data->parameters[0]->weather->{"weather-conditions"}[$x]!=NULL){ 
     return $content->data->parameters[0]->weather->{"weather-conditions"}[$x][0]->value['weather-type']; 
    } 
}