是否有PHP等效的JavaScript的Array.prototype.some()函数

时间:2016-10-05 13:45:05

标签: javascript php functional-programming

在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()函数?

4 个答案:

答案 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个名称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;
}

答案 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