php – simpleXml到数组行为看起来很奇怪 – 打破9941项
EDIT3:似乎问题发生在我的localhost XAMPP
PHP 5.3设置上,而不是在我测试过的任何运行php 5.2的远程服务器上.还不清楚它的php或xampp(或者可能是组合)是否会导致错误/ EDIT3
我有一个xml,大约有12000个名字要添加到一个数组中. <smdusersync datetime="2010-12-13 13:51:16"> <userstoadd> <User fnamn="Adam" enamn="Svensson" email="adam@darkeye.se" password="3906" /> <User fnamn="Brooke" enamn="Jarnbjer" email="brooke@gmail.com" password="2729" /> <User fnamn="Caesar" enamn="Carlsson" email="caesar@comhem.se" password="1668" /> <!-- about 12000 other users --> </userstoadd> <userstoremove> </userstoremove> </smdusersync> 编辑2:我尝试过其他xml示例,包括以编程方式生成没有attbute等,这没关系 – 仍然是下面描述的相同问题… / EDIT2 在xml userstoadd子项上运行简单的foreach循环时,奇怪的事情开始了 (请注意,下面的示例中包含导致错误的代码 – 它不是一个有用的示例……) 运行一个简单的foreach循环(这里只是将一个testcounter推送到数组)按预期工作: $user_xml = simplexml_load_file('users.xml'); $xml_count = $user_xml->userstoadd->children()->count(); $users_arr = array(); $test_count = 0; foreach ($user_xml->userstoadd->children() as $user) { array_push($users_arr,$test_count); // << Works as expected! $test_count++; } echo $xml_count,'/',$test_count; $xml_count和$test_count始终具有相同的值. 当我这样做时,除了我将一个简单的对象推送到数组之外,如果xml用户的数量< = 9940,一切正常: $user_xml = simplexml_load_file('users.xml'); $xml_count = $user_xml->userstoadd->children()->count(); $users_arr = array(); $test_count = 0; foreach ($user_xml->userstoadd->children() as $user) { $dummy_object = new StdClass(); // << Empty dummy object array_push($users_arr,$dummy_object); // << CAUSES ERROR if more than 9940 items...! $test_count++; } echo $xml_count,$test_count; // << SHOULD BE THE SAME! 拥有9940 xml用户项目时,输出符合预期9940/9940. 突然差不多10000了!并且用户项目的内容似乎并不重要…我已经复制并移动了具有相同结果的xml用户项目… 编辑:当超过9940项,它突然加倍,使9941项给(9940 x 2)1 = 19881. 知道这里发生了什么吗? 解决方法
以下精神错乱为我解决了这个问题:
您可能想要注释掉测试(50000);线. <?php test(9996); // works (echoes 9996/9996/9996) test(9997); // BREAKS on my XAMPP php 5.3.1! (echoes 9997/19993/19993) test(50000); // test with larger number function test($items_to_create) { $xml_str = '<root>' . chr(13); for($i=0; $i<$items_to_create; $i++) { $xml_str .= '<item attr="t' . $i . '"/>' . chr(13); } $xml_str .= '</root>'; $xml = new SimpleXMLElement($xml_str); $xml_children = $xml->children(); $xml_count = $xml_children->count(); $arr = array(); $test_count = 0; /* foreach ($xml->children() as $user) { $dummy_object = new StdClass(); array_push($arr,$dummy_object); $test_count++; } */ for ($i=0; $i<$xml_count; $i++) { $dummy_object = new StdClass(); $dummy_object->foo = $xml_children[$i]->attributes()->attr; array_push($arr,$dummy_object); $test_count++; } $arr_count = count($arr); echo '<br />CTRL+F for me:',$xml_count,$test_count,$arr_count,'<hr />'; echo '<pre>',print_r($arr,true),'</pre>'; } ?> 它能为你解决吗? (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |