从匿名函数中断array_walk

Vla*_*eda 15 php anonymous-function

有没有办法阻止array_walk匿名函数内部?

下面是一些示例代码(可行),用于显示我的意思,检查数组是否只有数值.

$valid = true;
array_walk($parent, function ($value) use (&$valid) {
    if (!is_numeric($value)) {
        $valid = false;
    }
});

return $valid ? 'Valid' : 'Invalid';
Run Code Online (Sandbox Code Playgroud)

如果我有一个足够大的数组,并且第一个条目无效,其余的(冗余)检查仍然完成,所以我想停止执行.

使用break/ continue不起作用(错误:) Fatal error: Cannot break/continue 1 level in ....

注意:我不想重写代码,我只想知道如果这是可能的.

Ant*_*ing 14

如上所述,从理论上说它是可能的,但我建议反对它.以下是如何使用Exception来突破array_walk.

<?php
$isValid = false;

$array = range(1, 5);

try {
    array_walk($array, function($value) {
        $isAMagicNumber = 3 === $value;
        if ($isAMagicNumber) {
            throw new Exception;
        } 
    });
}catch(Exception $exception) {
    $isValid = true;
}

var_dump($isValid);

/*
    bool(true)
*/
Run Code Online (Sandbox Code Playgroud)


Glu*_*exo 7

你可以在匿名函数中放置一个静态标志:

array_walk($ary, function($item) {
    static $done = false;
    if($done) {
        return;
    }

    // … your code

    if($myBreakCondition) {
        $done = true;
        return;
    }
});
Run Code Online (Sandbox Code Playgroud)

这实际上并没有停止迭代,但是在设置标志之后的所有其他循环都不做任何事情.效率不高,但如果迭代的数组不是太大,它可能会在没有任何更大性能影响的情况下工作.

在您的情况下,代码将是:

$valid = true;
array_walk($parent, function($value) use(&$valid) {
    static $done = false;
    if($done) {
        return;
    }

    if(!is_numeric($value)) {
        $valid = false;
        $done = true;
        return;
    }
});
return $valid ? 'Valid' : 'Invalid';
Run Code Online (Sandbox Code Playgroud)

但实际上,如果根本没有"休息",那将没有多大区别.只为每个无效值分配"假",这无关紧要,因为结果仍然是假的.也许我的静态变量欺骗会更有效率.

就你个人而言,我会array_filter改用:

$valid = count(array_filter($parent, 'is_numeric')) == count($parent);
Run Code Online (Sandbox Code Playgroud)

要不就

$valid = array_filter($parent, 'is_numeric')) == $parent;
Run Code Online (Sandbox Code Playgroud)

如果$parent数组中的所有值都是数字,则在过滤后它们将全部存在.另一方面,数组中的任何非数字值都会影响已过滤数组中的内容(减少项目数),并且比较将产生错误.