加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

php – simpleXml到数组行为看起来很奇怪 – 打破9941项

发布时间:2020-12-13 17:05:21 所属栏目:PHP教程 来源:网络整理
导读:EDIT3:似乎问题发生在我的localhost XAMPP PHP 5.3设置上,而不是在我测试过的任何运行php 5.2的远程服务器上.还不清楚它的php或xampp(或者可能是组合)是否会导致错误/ EDIT3 我有一个xml,大约有12000个名字要添加到一个数组中. xml结构如下所示: smdusersy
EDIT3:似乎问题发生在我的localhost XAMPP PHP 5.3设置上,而不是在我测试过的任何运行php 5.2的远程服务器上.还不清楚它的php或xampp(或者可能是组合)是否会导致错误/ EDIT3

我有一个xml,大约有12000个名字要添加到一个数组中.
xml结构如下所示:

<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.
但是当拥有9941 xml用户项目时,输出为9941/19881!
当拥有9942 xml用户项目时,输出为9942/19882!

突然差不多10000了!并且用户项目的内容似乎并不重要…我已经复制并移动了具有相同结果的xml用户项目…

编辑:当超过9940项,它突然加倍,使9941项给(9940 x 2)1 = 19881.
使用单个xml用户项目12000次时没有区别. /编辑

知道这里发生了什么吗?

解决方法

以下精神错乱为我解决了这个问题:

您可能想要注释掉测试(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>';
}
?>

它能为你解决吗?

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读