Эта строка (preg_match('/^\d+$/', $quantity)) ? $quantity : 1
является троичным оператором, который сопоставляет заданное количество с шаблоном регулярного выражения, который говорит: «Если заданное количество является любой последовательностью, по крайней мере, целого числа или более (то есть 1 is true
, 432 is true
, 84835 is true
, 2 is true
, 2.78 is false
), затем передайте его как есть. Если данное количество не соответствует шаблону регулярного выражения (т.е. 2.78 which is false
), тогда присвойте значение 1 этой переменной ".
В вашем случае вы можете либо создать шаблон регулярного выражения, например /^\d+\.\d+$/
, который будет принимать все виды чисел, разделенных точкой (то есть 2.78 is true
, 22.78 is true
, 84728774.87923587 is true
), либо вы можете свести шаблон регулярного выражения вверх по вашему желанию десятичных знаков, как это /\d+\.\d{2,3}/
. Этот шаблон принимает только 2 or 3 digits
после точки, что означает, что числа как 2.78, 22.789 or 287398724.32 are accepted
, но числа как 2.8 or 2.9084 are NOT accepted
. Это все для регулярных выражений.
После исправления шаблона регулярных выражений вы всегда можете использовать метод типизации для своего результата, например $this->items[$id][$index]['quantity'] += (float)$quantity;
, чтобы добавить его к вашему итогу.
Убедитесь, что ваши количества всегда рассматриваются как числа с плавающей точкой, даже если вы используете целые числа. Например, количество 1
должно быть 1.00
.
. Причина, по которой я предлагаю эту модификацию регулярного выражения, заключается в том, что ваша функция уже использует регулярное выражение. В противном случае вы можете играть только с длиной значения, значением больше 0 и другими проверками.
Надеюсь, это поможет!