Выход из цикла внутри функции обратного вызова в PHP - PullRequest
0 голосов
/ 30 июня 2019

Для проекта я использую большое количество данных и мне нужно разбить его на части для обработки. Этот процесс запускается несколько раз для разных пользователей. Все это работает хорошо. Тем не менее, иногда обработка должна выдать ошибку остановки, чтобы изящно вырваться из сценария (IE: не использовать 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 уровня

1 Ответ

1 голос
/ 30 июня 2019

Может быть, 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
}
...