我准备这个解决方案尽可能接近JavaScript's 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 - 数组中正在处理的元素的当前 value。
$key(可选)- 数组中正在处理的元素的当前 key。
$index(可选)- 数组中正在处理的当前元素的索引。
$array(可选)- 被遍历的数组。
$thisArg(可选)
执行$callback 函数时用作$this 的值。
返回值:
true 如果$callback 函数为每个数组元素返回一个真值。否则,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