在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()函数?
答案 0 :(得分:11)
不,PHP标准库中没有短路等效项。有许多非短路解决方案,其中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
答案 1 :(得分:10)
它不包含在内,但很容易创建。这使用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;
}
答案 2 :(得分:0)
有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;
}
}
答案 3 :(得分:-3)
使用array_filter并提供回调。将其包装在另一个函数中以计算是否有任何结果
function array_some(array $data, callable $callback) {
$result = array_filter($data, $callback);
return count($result) > 0;
}
$myarray = [2, 5, 8, 12, 4];
array_some($myarray, function($value) {
return $value > 10;
}); // true