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()関数と同等のものはありますか?
いいえ、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 。
含まれていませんが、簡単に作成できます。これは SRFI-1 名前any
とevery
を使用しますが、some
とall
に名前を変更できます:
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;
}
与えられたコールバックの戻り値に基づいて与えられた配列のサブセットを返す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;
}
}