停止循环并输出然后继续php

时间:2012-06-17 15:56:39

标签: php arrays loops foreach

好的,我觉得现在是时候在这里问我的剧本了,

我有一个大型数组,我想循环它,然后在达到一定数量时停止它,然后继续循环,这是脚本的一个示例,

$result_array = array();
$locations = //array of locations coming from a XML SOAP respond;

foreach($locations as $loctn){
    //Request of the XML,
    $result = //A large array coming from a XML SOAP respond;

    foreach($result as $val){
        $result_array[] = 'somkey' => $val->identifcator,
                          'somkey1' => $val->language,
                          'somkey2' => $val->textSubjectQualifier,
                          'somkey3' => $val->companyId,
                          //etc.
    }
}

print_r($result_array);

所以第一个数组来自XML响应,我再次使用位置循环它,并再次从XML请求,然后我再次将它循环到另一个数组中,然后我想输出循环外的最后一个数组,< / p>

但是我在这里遇到麻烦,因为它是一个非常大的数组,如果数组不是那么大,它会很好但是当我想把它做得更大然后我没有结果因为浏览器停止它,

我试着玩内存,但它没有解决我的问题所以我想最好的方法是我应该停止数组然后输出它然后继续循环,但我不知道该怎么做,

请帮帮我

谢谢

2 个答案:

答案 0 :(得分:1)

echo str_repeat(' ', 4096); // you need this or something similar, because most of browsers don't print anything if they don't have enough to parse

foreach (...) {
...
    foreach (...) {
        ...
        print_r($result_array);
        flush(); // echo the buffer
    }
}

有时浏览器在收到足够的数据之前不会显示任何内容,这就是str_repeat()的原因。

从PHP手册:

  

flush()可能无法覆盖您网络的缓冲方案   服务器,它对任何客户端缓冲没有影响   浏览器。 [...]

     

像mod_gzip这样的Apache服务器模块可以自己缓冲   这将导致flush()不会导致数据立即发送   给客户。

     

即使是浏览器也可能在显示之前缓冲输入。网景   例如,缓冲文本,直到它收到行结束或   标记的开头,它不会渲染表直到标记   看到最外层的桌子了。

     

某些版本的Microsoft Internet Explorer才会启动   在收到256字节的输出后显示页面,所以你   可能需要在刷新之前发送额外的空格才能获得这些空格   浏览器显示页面。

尝试修复代码:

echo str_repeat(' ', 4096);
$result_array = array();
$locations = //array of locations coming from a XML SOAP respond;

foreach($locations as $loctn){
    //Request of the XML,
    $result = //A large array coming from a XML SOAP respond;

    foreach($result as $val){
        $result_array[] = 'somkey' => $val->identifcator,
                          'somkey1' => $val->language,
                          'somkey2' => $val->textSubjectQualifier,
                          'somkey3' => $val->companyId,
                          //etc.

        print_r($result_array);
        flush();
    }
}

此代码应在每个循环中打印$ result_array。

答案 1 :(得分:1)

  

但是我在这里遇到麻烦,因为它是一个非常大的数组,如果数组不是那么大,它会很好但是当我想把它做得更大然后我没有结果因为浏览器停止它,

听起来就像你正在执行超时(就像@Haroon提到的那样)。您可能希望查看错误日志或检查请求是否因状态500(内部服务器错误)而失败。

set_time_limit()允许您(重新)设置执行超时。但是,如果您的脚本运行超过30秒(这应该是执行超时的默认设置),您可能需要调查构建该阵列的备用路径。


foreach($locations as $loctn){
//Request of the XML,
$result = //A large array coming from a XML SOAP respond;

听起来你正在从网络服务中提取数据。听起来你可能(对于$locations中的大量项目)在该网络服务上做了大量的请求。

访问网络服务可能会很慢。如果你有任何办法在你的过程之外做这件事(“工作队列”,有cron工作的东西,......)做。还要检查Web服务提供的数据是否可以缓存和重用。