19

array_walk匿名関数内からを停止する方法はありますか?

これは、配列に数値のみが含まれているかどうかを確認する、私が何を意味するかを示すサンプルコード (機能する) です。

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

return $valid ? 'Valid' : 'Invalid';

十分な大きさの配列があり、最初のエントリが無効な場合、残りの (冗長な) チェックは引き続き実行されるため、実行を停止したいと思います。

break/の使用continueは機能しません (エラー: Fatal error: Cannot break/continue 1 level in ...)。

注:コードを書き直したくありません。これが可能かどうかを知りたいだけです。

4

2 に答える 2

9

無名関数内に static フラグを入れることができます。

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

    // … your code

    if($myBreakCondition) {
        $done = true;
        return;
    }
});

これは実際には反復を停止しませんが、フラグが設定された後のすべてのサイクルは単に何もしません。あまり効率的ではありませんが、反復される配列が大きすぎなければ、パフォーマンスに大きな影響を与えずに機能する可能性があります。

あなたの場合、コードは次のようになります。

$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';

しかし、実際には「切れ目」がまったくなかったとしても大した違いはありません。すべての無効な値には「false」のみが割り当てられますが、結果は依然として false であるため問題ありません。私の静的変数チートの方が効率的かもしれません。

個人的にあなたの場合、array_filter代わりに使用します:

$valid = count(array_filter($parent, 'is_numeric')) == count($parent);

あるいは単に

$valid = array_filter($parent, 'is_numeric')) == $parent;

配列内のすべての値$parentが数値である場合、それらはすべてフィルタリング後に存在します。一方、配列内の数値以外の値は、フィルター処理された配列の内容に影響を与え (項目数を減らし)、比較は false になります。

于 2015-04-28T04:52:12.557 に答える