web-dev-qa-db-ja.com

PHP JavaScriptのArray.prototype.some()関数に相当するものはありますか?

JavaScriptでは、次のことができます。

function isBiggerThan10(element, index, array) {
  return element > 10;
}
[2, 5, 8, 1, 4].some(isBiggerThan10);  // false
[12, 5, 8, 1, 4].some(isBiggerThan10); // true

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/some

PHP some()関数と同等のものはありますか?

20
Rory

いいえ、PHP標準ライブラリには同等のshort Circuitingはありません。非短絡はいくつでもあります。ソリューション、その中でarray_reduceはおそらく最適です:

var_dump(array_reduce([2, 5, 8, 1, 4], function ($isBigger, $num) {
    return $isBigger || $num > 10;
}));

独自のsome/any/all関数を実装するか、次のような関数型プログラミングプリミティブのコレクションを提供するライブラリを使用する価値があります。 https://github.com/lstrojny/functional-php

13
deceze

含まれていませんが、簡単に作成できます。これは SRFI-1 名前anyeveryを使用しますが、someallに名前を変更できます:

function array_any(array $array, callable $fn) {
    foreach ($array as $value) {
        if($fn($value)) {
            return true;
        }
    }
    return false;
}

function array_every(array $array, callable $fn) {
    foreach ($array as $value) {
        if(!$fn($value)) {
            return false;
        }
    }
    return true;
}
13
Sylwester

与えられたコールバックの戻り値に基づいて与えられた配列のサブセットを返すarray_filter()があります。サブセットが空の場合、Some()がfalseを返すのと同じです。空でない場合、Some()がtrueを返すのと一致します。

$unfiltered = [1, 11, 2, 22, 3, 33, 4, 44, 5, 55];
$filtered = array_filter ($unfiltered, function ($elem){
    return $elem > 10;
});

print_r ($unfiltered);
print_r ($filtered);
var_dump (empty ($filtered));

ただし、この方法では短絡は発生せず、パフォーマンスは配列のサイズに反比例します。ただし、これは実際の世界では問題になりません。これは、配列が依然として非常に大きくなるか、array_filterが何度も呼び出されてから、パフォーマンスへの影響に気付くからです。

パフォーマンスが最優先の場合は、配列を自分でループし、一致が見つかったらすぐにループから抜け出す必要があります。

$biggerThanTen = false;
foreach ($unfiltered as $elem)
{
    if ($elem > 10)
    {
        $biggerThanTen = true;
        break;
    }
}
0
GordonM