Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/280.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php simplexmlelement上foreach中的无限循环_Php_Foreach_Infinite Loop_Xdebug - Fatal编程技术网

Php simplexmlelement上foreach中的无限循环

Php simplexmlelement上foreach中的无限循环,php,foreach,infinite-loop,xdebug,Php,Foreach,Infinite Loop,Xdebug,我面临一个特殊的问题,因为我没有找到太多的参考资料。我发现其中描述了同样的问题,但已经有一年没有答案了,也没有任何答案 为了了解一下上下文,我尝试使用PHPOffice/PHPExcel,当加载xlsx文件时,这个框架在simplexmlement上循环,位于Excel2007.php的第364到376行,在这里提取了其中的几行(我添加了var_dump和echo): $colorscheme变量是一个SimpleXMLElement,它包含12个SimpleXMLElement,所有这些12个

我面临一个特殊的问题,因为我没有找到太多的参考资料。我发现其中描述了同样的问题,但已经有一年没有答案了,也没有任何答案

为了了解一下上下文,我尝试使用
PHPOffice/PHPExcel
,当加载
xlsx
文件时,这个框架在
simplexmlement
上循环,位于
Excel2007.php
的第364到376行,在这里提取了其中的几行(我添加了var_dump和echo):

$colorscheme
变量是一个
SimpleXMLElement
,它包含12个
SimpleXMLElement
,所有这些12个元素都有一个
SimpleXMLElement
0作为子元素,只有一个元素有
“srgbClr”

当我试着调试它时,
$k
变量在循环的2次迭代中得到更新,然后没有进一步改变(在
$colorScheme
中出现了12次),从而无限循环(或者至少直到时间限制,我尝试了一个很长的值)

如果我对我的
php.ini
中的以下几行进行注释(我在Windows 7上使用的是64b版本的
wampServer
,开始使用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
编辑:更多信息。 在我在eclipse中添加一个断点并要求调试我的页面之前,一切似乎都很正常(
php.ini
commented或not)。一旦我添加了一个断点,无限循环就会发生,我会被最大执行时间或最大内存限制所阻止。我用一个小文件(20KB)对它进行了测试,不管是否调试,它都能正常工作,而用一个大文件(750KB)测试,结果失败了。 在单步执行时,我可以肯定地看到我的密钥
$k
在第二次迭代后不会得到更新

如果有任何人有一个想法,或者任何可以帮助我在没有无限循环的情况下进行调试的东西,那就太好了


非常感谢您的时间和帮助

我最近刚刚在同一个文件中完成了一些类似的工作。我花了很长时间才意识到SimpleXML扩展中有一个bug可能导致以下情况:

似乎对我有用的不是做:

foreach ($colourScheme as $k => $xmlColour) {
   ...
}
尝试使用
children()
方法:

foreach ($colourScheme->children() as $k => $xmlColour) {
   ...
}
另一种尝试是在尝试循环之前使用计数将其包装:

if ($colourScheme->count() > 0) {
   ...
}
这里的问题是SimpleXML对象不是数组,并且并不总是按照您可能认为的方式运行。即使是
children()
的文档(可能与
foreach
循环中的强制转换行为相同)也指出,无论是否有子元素,都将返回SimpleXML元素。因此,在同一对象上反复迭代(无限循环):

如果所有其他方法都失败了,您可以通过以下方式解决:

$xml = simplexml_load_string($xmlstring);
$json = json_encode($xml);
$array = json_decode($json,TRUE);
参考资料:


哇,回答得真好!我现在理解了这个问题,我会让PHPOffice团队来看看。我仍然想知道为什么在调试时会出现问题,而不是在扩展未激活时。你知道吗?在XDEBUG未激活的情况下,它肯定可以在小文件上工作。您好!更多信息:在我使用Eclipse的调试点开始调试之前,文件会得到正确处理。在添加断点之前,无论php.ini中的行是否被注释,一切都正常。调试完成后,我会在第二次迭代时陷入困境,并且密钥不会得到更新。然后我超过了最大执行时间或最大内存限制。您好,我真的很抱歉,但我现在无法复制它,因为我已经在eclipse配置和应用程序中进行了一些修改。。。问题似乎不再出现,无论是在调试中还是在常规配置中。如果我再遇到它,我一定会让你知道的!我结束这个话题。祝2016年万事如意!刚被这个虫子咬了。复制它最简单的方法是这样做:
$as=$xml->a;foreach($as$a){}
而不是这样做:
foreach($xml->a as$a){}
并运行一个xdebug会话(即跨代码行)。这会触发前面提到的
$xml = simplexml_load_string($xmlstring);
$json = json_encode($xml);
$array = json_decode($json,TRUE);