微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

php – 在一个simplexmlelement上的foreach中的无限循环

我面临一个特殊的问题,因为我没有找到太多的参考资料.我发现simpleXMLElement attributes and foreach描述了同样的问题,但一年没有回答,也没有任何答案.

对于一些上下文,我正在尝试使用PHPOffice / PHPExcel,并且当加载xlsx文件时,此框架循环在Excel2007.PHP的第364到376行的simplexmlelement上,可在https://github.com/PHPOffice/PHPExcel/blob/1.8/Classes/PHPExcel/Reader/Excel2007.php获得,其中提取了几行这里(我添加了var_dump和echo):

foreach ( $colourScheme as $k => $xmlColour ) {
    var_dump ( $xmlColour ); echo 'NEWVAR';
    $themePos = array_search ( $k, $themeOrderArray );
    if (! $themePos) {
        $themePos = $themeOrderAdditional ++;
    }
    if (isset ( $xmlColour->sysClr )) {
        $xmlColourData = $xmlColour->sysClr->attributes ();
        $themeColours [$themePos] = $xmlColourData ['lastClr'];
    } elseif (isset ( $xmlColour->srgbClr )) {
        $xmlColourData = $xmlColour->srgbClr->attributes ();
        $themeColours [$themePos] = $xmlColourData ['val'];
    }
}

$colourScheme var是一个SimpleXMLElement,它包含12个SimpleXMLElements,并且所有12个都有一个SimpleXMLElement 0作为子节点,除了有一个“srgbClr”.

当我尝试调试它时,$k var在循环的2次迭代中得到更新,然后不再进一步改变(并且$colorScheme中有12次出现),因此无限循环(或至少直到时间限制,并且我尝试了很长的价值).

如果我评论我的PHP.ini的以下行(我正在使用64b版本的wampServer,在Windows 7上,使用eclisePDT调试图标作为Web应用程序开始调试),无限循环似乎不会发生,并且文件似乎很好地改变了.

; XDEBUG Extension

zend_extension = "D:/path/to/wamp/bin/PHP/PHP5.5.12/zend_ext/PHP_xdebug-2.2.5-5.5-vc11-x86_64.dll"
;
[xdebug]
xdebug.remote_enable = on
xdebug.remote_host = "localhost"
xdebug.remote_port = 9000
xdebug.remote_handler = "dbgp"
xdebug.remote_mode = req
xdebug.profiler_enable = On
xdebug.profiler_enable_trigger = off
xdebug.profiler_output_name = cachegrind.out.%t.%p
xdebug.profiler_output_dir = "D:/path/to/tmp/tmp"
xdebug.show_local_vars = on
xdebug.collect_params = on

编辑:更多信息.
一切似乎工作正常(PHP.ini注释与否),直到我在eclipse中添加断点并要求调试我的页面.一旦我添加一个断点,就会发生无限循环,并且我会被最大执行时间或最大内存限制所限制.我用一个文件(20KB)测试它,它似乎工作,调试与否,以及更大的(750KB),它失败了.
在踩踏时,我肯定可以看到我的密钥$k在第二次迭代后没有得到更新.

如果有人有想法,或任何可以帮助我调试而没有无限循环的东西,那就太好了!

非常感谢您的时间和帮助!

解决方法:

我刚刚在同一个文件中完成了一些类似的工作.我花了很长时间才意识到的一件事是SimpleXML扩展中有一个错误导致这个错误https://bugs.php.net/bug.php?id=55098

似乎对我有用的不是做:

foreach ($colourScheme as $k => $xmlColour) {
   ...
}

尝试使用children()方法

foreach ($colourScheme->children() as $k => $xmlColour) {
   ...
}

另一件要尝试的是在尝试循环之前用计数包装它:

if ($colourScheme->count() > 0) {
   ...
}

这里的问题是SimpleXML对象不是一个数组,并不总是像你想象的那样运行.甚至child()的文档(可能与foreach循环中发生的转换行为相同)表示无论是否有子项,都将返回SimpleXML元素.因此,您一遍又一遍地迭代同一个对象(无限循环):

enter image description here

如果所有其他方法都失败了,你可以通过convert it to a real array处理它:

$xml = simplexml_load_string($xmlstring);
$json = json_encode($xml);
$array = json_decode($json,TRUE);

参考文献:

http://php.net/manual/en/simplexmlelement.children.php
http://php.net/manual/en/simplexmlelement.count.php

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐