从array_walk跳出

rev*_*evo 0 php

我想知道当你找到你想要的结果时,是否有办法打破遍历数组的其余部分:

array_walk($arr, function($value, $key)
{
    if($value == "test")
    {
        global $id;
        $id = $key;
        break; // I know that break doesn't work! that's just for example.
    }
});
Run Code Online (Sandbox Code Playgroud)

上面的例子展示了我所说的从 array_walk

Axe*_*cía 5

根据此答案(/sf/answers/1249735161/),您可以使用缓存异常破坏函数:

try {
    array_walk($arr, function($value, $key)
    {
        if($value == "test")
        {
            global $id;
            $id = $key;
            throw new Exception;
        }
    });
} catch (Exception $e) {
    //
}

// Rest of your code
Run Code Online (Sandbox Code Playgroud)

虽然我也建议您使用普通的break能够循环。

祝你好运;


编辑

这也可能是一种解决方案,更具语义。这不会破坏闭包,而是只运行一次条件。也摆脱了那个讨厌的全局。

$array = array(1,2,3,'test',5,6,7,8,9,10);
$stop = false;
$id = 0;
array_walk($array, function($value, $key) use ($stop, &$id){
    if (!$stop && $value == 'test') {
        $id = $key;
        $stop = true;
        echo $id;
    }
});
// This just echo 3;
Run Code Online (Sandbox Code Playgroud)

  • 哇。虽然这*是*一个解决方案,但我永远不会建议它。这就像使用手提钻锤击相框挂钩一样。 (2认同)