繁体   English   中英

PHP 相当于 JavaScript 的“array.every()”是什么?

[英]What is PHP's equivalent of JavaScript's "array.every()"?

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

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

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

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

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

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

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

这是另一种选择(实际上,许多数组函数的使用方式非常相似):

$bool = !empty(array_filter(['my', 'test', 'array'], function ($item) {
    return $item === 'array';
}));

或者对于 PHP7.4+,使用箭头函数:

$bool = !empty(array_filter(['my', 'test', 'array'], fn($item) => $item === 'array'));

...看起来很接近 JS:

let bool = ['my', 'test', 'array'].every(item => item === 'array'));

并爆发:

function array_every(array $array, callable $callback) {
    return !empty(array_filter($array, $callback));
}

$myArr = ['my', 'test', 'array'];
$myTest = fn($item) => $item === 'array'; // PHP7.4+
$bool = array_every($myArr, $myTest);

同样,几个数组函数可用于返回空数组或填充数组。 尽管正如上面提到的那样,实际的 JS [].every会在获得true返回值后立即停止,如果您有一个大数组要迭代,这可以节省大量时间。 我遇到了这个问题,寻找一个快速的、函数式编程风格的代码来迭代三个数组项。

我准备这个解决方案尽可能地接近JavaScript 的Array.prototype.every()

建议的自定义功能:

描述:

array_every()方法测试数组中的所有元素是否通过提供的函数实现的测试。 它返回一个布尔值。

array_every()方法对数组中存在的每个元素执行一次提供的$callback函数,直到找到$callback返回虚假值的那个。 如果找到这样的元素, array_every()方法会立即返回 false。 否则,如果$callback为所有元素返回一个真值,每个都返回真。

注意:在空数组上调用此方法将在任何条件下返回 true!

array_every()方法不会改变调用它的数组。

array_every(array $array, string|callable $callback, null|string|object $thisArg = null): bool

参数:

$数组

要迭代的数组。

$回调

用于测试每个元素的回调函数,采用四个参数:

$value - 数组中正在处理的元素的当前

$key (可选) - 数组中正在处理的元素的当前

$index (可选) - 数组中正在处理的当前元素的索引。

$array (可选) - 被遍历的数组。

$thisArg (可选)

执行$callback函数时用作$this值。

返回值:

如果$callback函数为每个数组元素返回一个真值, $callback true 否则为false

array_every() 函数:

function array_every(array $array, string|callable $callback, null|string|object $thisArg = null): bool
{
    $index = 0;

    foreach ($array as $key => $value) {

        $condition = false;

        if (is_null($thisArg)) {
            $condition = call_user_func_array($callback, [$value, $key, $index, $array]);
        } else if (is_object($thisArg) || (is_string($thisArg) && class_exists($thisArg))) {
            $condition = call_user_func_array([$thisArg, $callback], [$value, $key, $index, $array]);
        } else if (is_string($thisArg) && !class_exists($thisArg)) {
            throw new TypeError("Class '$thisArg' not found");
        }

        if (!$condition)
            return false;
        $index++;
    }
    return true;
}

示例 1(简单回调函数):

$isEven = fn($v) => ($v % 2 === 0);

var_export(array_every([2, 8, 16, 36], $isEven)); // true

示例 2:

如果$thisArg参数提供给array_every()方法,它将用作$callback$this值。 否则,值null将用作其$this值。

class Helper
{
    public function isOlderThan18(int $value): bool
    {
        return $value > 18;
    }

    public static function isVowel(string $character): bool
    {
        return in_array($character, ['a', 'e', 'i', 'o', 'u']);
    }

}

示例 2a) 静态类方法调用:

如果有问题的类在命名空间下声明,您可以在$thisArg参数中传递完全限定的类名

var_export(array_every(["a", "u", "e"], "isVowel", "Helper")); // true

示例 2b) 对象方法调用:

$thisArg参数也可以是一个对象。

var_export(array_every(["Peter" => "35", "Ben" => "16", "Joe" => "43"], "isOlderThan18", (new Helper))); // false

我先写了这些代码:

function array_every(callable $callback, array $array) {
    $matches = [];
    foreach ($array as $item) {
        if ($callback($item)) {
            $matches[] = true;
        } else {
            $matches[] = false;
        }
    }
    if (in_array(false, $matches)) {
        return false;
    }
    return true;
}

然后写了它的迷你版:

function array_every(callable $callback, array $array) {
    foreach ($array as $item) {
        if (!$callback($item)) return false;
    }
    return true;
}

用法:

$array = [1, 2, 3];
$result = array_every(function($item) {
    return $item == 3; // Check if all items are 3 or not (This part is like JS)
}, $array);

echo $result; // Returns false, but returns true if $array = [3, 3, 3]

所以两个版本都很好用
你得到了答案::)

我的情况是我需要检查一个数组,以了解如果一切顺利,它的所有值是否都是返回true的数字。 如果有字符串或其他内容,function 必须返回false

protected function checkIsNumber($arrayNumbers = []) {
    $ga = NULL;
    foreach($arrayNumbers as $value) { 
        if(is_null($ga)) {
            $ga = is_numeric(trim($value));
        } else {
            $ga = $ga === is_numeric(trim($value));
        }
    }
    
    return $ga;
}

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM