【问题标题】:Breaking out of Loop from within Callback Function in PHP从 PHP 中的回调函数中跳出循环
【发布时间】:2019-06-30 03:03:55
【问题描述】:

对于一个项目,我正在运行大量数据吞吐量并且需要对其进行分块处理。此过程针对不同的用户运行多次。所有这些都运行良好。但有时,处理需要抛出停止错误以优雅地中断脚本(即:不使用die(),而是记录错误)并继续处理下一个用户的数据。

这是我的脚本的一个非常简化的版本。我知道这可以在这种简单模式下重新排列以完全删除回调函数,但实际脚本需要这样设置。

<?php
$user_data = array(
    'User 1' => array(
        array(
            1,2,3,4,5,6,7,8,9,
        ),
        array(
            10,11,12,13,14,15,16,17,18,
        ),
    ),
    'User 2' => array(
        array(
            1,2,3,4,5,6,7,8,9,10
        ),
        array(
            11,12,13,14,15,16,17,18,19,20
        ),
    ),
);
foreach($user_data as $data_chunks){
    foreach($data_chunks as $data_set){
        foreach($data_set as $data){
            myFunction($data, function($returned_data, $stop){
                if($stop){
                    //log error
                    break 2;
                }
                print $returned_data." ";
            });
        }
    }
}

function myFunction($data, callable $f){
    $stop = false;
    if($data>5){
        $stop = true;
    }
    $data_to_return = $data*2;
    $f($data_to_return,$stop);
}
?>

Php 为

抛出一个致命错误

致命错误:无法中断/继续 2 个级别

【问题讨论】:

  • 让你的函数提前返回一个值,表明它需要中断。
  • @Cfreak 是否可以将值返回给回调函数?我在 PHP 文档中没有看到任何这样的例子。
  • 我考虑过使用全局变量并检查它是继续还是停止。
  • 使用 try/catch 块,并在回调函数中抛出异常。

标签: php function foreach callback break


【解决方案1】:

能否让 myFunction 返回一个值来指示循环是否应该停止?

foreach($user_data as $data_chunks){
    foreach($data_chunks as $data_set){
        foreach($data_set as $data){
            // V-- Collect return value below
            $returned_stop = myFunction($data, function($returned_data, $stop){
                if($stop){
                    //log error
                }
                print $returned_data." ";
            });
            if ($returned_stop) { // <- Check to stop here
              break 2;
            }
        }
    }
}

function myFunction($data, callable $f){
    $stop = false;
    if($data>5){
        $stop = true;
    }
    $data_to_return = $data*2;
    $f($data_to_return,$stop);
    return($stop); // <- Return here
}

【讨论】:

  • 这应该可行,我将在明天实施和测试。我一直试图从回调函数而不是被调用的函数中获取返回值。
猜你喜欢
  • 1970-01-01
  • 2018-10-20
  • 2016-12-17
  • 1970-01-01
  • 1970-01-01
  • 2018-09-06
  • 2011-01-31
  • 2013-12-12
  • 1970-01-01
相关资源
最近更新 更多