簡體   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