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";
}
编辑:如果它是不明确的,我需要通过孩子的阵列向后递归,不转发。
我能找到你的问题的一些各种问题:
的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'];
}
}
请问为什么你不只是使用foreach呢? – 2013-03-04 23:36:46
因为使用此方法通过子节点向后递归似乎更容易。 – Aehmlo 2013-03-04 23:37:40
如果您需要向后遍历数组,为什么不使用'array_reverse'来反转数组,并像正常一样循环它呢? – Axel 2013-03-04 23:56:36