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

Ror*_*ory 17 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
Run Code Online (Sandbox Code Playgroud)

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

是否有PHP等效的some()函数?

dec*_*eze 13

不,PHP标准库中没有短路等效项.有许多非短路解决方案,其中array_reduce可能最适合:

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

可能值得实现您自己的some/ any/ all函数,或者使用提供这样的函数式编程原语集合的库,例如https://github.com/lstrojny/functional-php.

  • 这将与array_filter解决方案具有几乎相同的性能(尽管它可能更好地用于内存使用). (3认同)
  • 这与 JS `Array.some()` 的行为不完全相同,因为它停在第一个返回 true 的元素上,不会继续其余的;) (2认同)

Syl*_*ter 13

它不包括在内,但很容易创建.这使用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;
}
Run Code Online (Sandbox Code Playgroud)