PHP与JavaScript的“ array.every()”等效吗?

Jos*_*val 6 javascript php

我目前正在尝试将一些JavaScript移植到PHP,但是,我似乎找不到与JavaScript等效的JavaScript“ array.every()”函数。我找到了PHP的“ each()”函数,但这似乎并不是我真正需要的。

ggo*_*len 11

此页面上的答案不完整,并且更改了every(JS) / all(Python) 以及其他语言中的类似函数的语义。映射和归约是不正确的,因为它们会访问每个元素,而不管其真值如何。

我们需要支持任意谓词的回调,并在找到第一个使谓词函数失败的元素时进行早期救援。这个答案很接近,因为它提供了早期救助,但未能提供回调谓词。

我们不妨一边写some/any一边写。

<?php

function array_every(array $arr, callable $predicate) {
    foreach ($arr as $e) {
        if (!call_user_func($predicate, $e)) {
             return false;
        }
    }

    return true;
}

function array_any(array $arr, callable $predicate) {
    return !array_every($arr, fn($e) => !call_user_func($predicate, $e));
}

// sample predicate
function is_even(int $e) {
    return $e % 2 === 0;
}

var_dump(array_every([0, 1, 2, 3], "is_even")); // => bool(false)
var_dump(array_every([0, 2], "is_even")); // => bool(true)
var_dump(array_any([1, 2], "is_even")); // => bool(true)
var_dump(array_any([1, 3], "is_even")); // => bool(false)
Run Code Online (Sandbox Code Playgroud)


Bri*_*cky 9

使用提前返回的 for 循环。

PHP 没有执行与 Javascript 的数组#every 相同的功能的本机函数。


loc*_*inz 5

使用foreach()

function allEven(array $values) 
{
    foreach ($values as $value) {
        if (1 === $value % 2) {
            return false;
        }
    }

    return true;
}

$data = [
    1,
    42,
    9000,
];

$allEven = allEven($data);
Run Code Online (Sandbox Code Playgroud)

参考:

注意 foreach比使用更好,array_reduce()因为一旦发现不满足规范的值,评估将停止。

  • 非常好的答案,因为它(a)有一个完整的代码示例,(b)有早期的救助,但可以改进为[接受回调](/sf/answers/4697829741/)而不是硬编码谓词。我不知道你为什么费心链接到“array_reduce”文档——该函数不适合此目的(正如你所说!)并且你(正确地!)不在你的代码中使用它。 (2认同)