tgoop.com/phpyh/614
Create:
Last Update:
Last Update:
Недавно в Пыхтелке кто-то возмутился, что для пустой коллекции Illuminate\Support\Collection::every() возвращает true
. Я сходу ответил:
Так и должно быть. В PHP 8.4 аналогично для пустого массива array_all вернёт true, array_any — false.
Согласитесь, ответ неубедительный. Давайте формально докажем, что функция
array_all
должна возвращать true
для пустого массива. В качестве примера возьмём фильтр положительных чисел:
/** @var list<int> */
$ints = [];
$isPositive = static fn (int $x): bool => $x > 0;
assert(array_all($ints, $isPositive));
Чтобы не рассуждать по-дилетантски, попробуем вспомнить классическую логику. Там есть такая операция — импликация (логическое следование). Она описывает связь
посылка ⇒ следствие
. Таблица истинности:
Пример | a | b | a ⇒ b
-----------------------------------------------------
Верно, что если Солнце куб, то 3 <= 0 | 0 | 0 | 1
Верно, что если Солнце куб, то 3 > 0 | 0 | 1 | 1
Ложно, что если Солнце шар, то 3 <= 0 | 1 | 0 | 0
Верно, что если Солнце шар, то 3 > 0 | 1 | 1 | 1
Выглядит наивно, потому что это так называемая материальная импликация. В ней посылка и следствие не связаны по смыслу, что приводит к парадоксам. Но для нашей задачи она подойдёт.
Что говорит нам эта таблица?
1. из истины (Солнце — шар) следует только истина (
3 > 0
),2. из лжи (Солнце — куб) следует всё что угодно (
3 > 0
, 3 <= 0
).Кстати, второе свойство мы иногда используем в быту: "Когда рак на горе свистнет, тогда можно будет купить запись Хардкорного курса PHP".
Теперь к массиву. Что такое
any
в PHP и every
в Laravel? Это квантор всеобщности ∀, то есть условие, которое выполняется для всех элементов. Выражение array_all($ints, $isPositive) === true
на языке формальной логики можно записать так:
∀ $x ∈ int : $x in $ints ⇒ $x > 0
для любого целого числа $x такого, что $x принадлежит массиву $ints, верно, что $x — положительное
Так как массив
$ints
пустой, то утверждение "$x
принадлежит массиву $ints
" ложно. Сделаем замену:
∀ $x ∈ int : false ⇒ $x > 0
для любого целого числа $x такого, что ложь, верно, что $x — положительное
А теперь применим то, что мы осознали выше: из лжи следует всё что угодно. Значит, вне зависимости от того, положительное число
$x
или нет, вся импликация истинна:
∀ $x ∈ int : true
для любого целого числа $x верно
Получается, что
array_all($ints, $isPositive) === true
всегда выполняется для пустого массива $ints
.Такая истинность называется бессмысленной (vacuous truth), так как она основана на невыполнимой посылке. По аналогии, можно будет с уверенностью сказать, что все присутствующие на Пыхапе хаскелисты боготворят PHP.