Массивы чисел PHP: полное руководство
Массив чисел в PHP: основные подходы
Как наиболее эффективно вычислить сумму элементов массива чисел?
$numbers = [10, 20, 30, 40, 50];
$sum = array_sum($numbers);
echo $sum; // 150150
Функция array_sum реализована на уровне C и работает быстрее, чем суммирование в цикле. Для пустого массива возвращает 0.
Типичная ошибка: если в массиве есть строки, не являющиеся числами (например, "abc"), array_sum приводит их к числу (0). Это может исказить результат. Рекомендуется предварительно отфильтровать массив с помощью array_filter и is_numeric.
Цель: быстрый подсчет суммы числовых значений.
Как создать массив чисел от 1 до 10 с шагом 2?
$range = range(1, 10, 2);
print_r($range);Array (
[0] => 1
[1] => 3
[2] => 5
[3] => 7
[4] => 9
)range генерирует последовательность чисел. Первые два аргумента - начальное и конечное число, третий - шаг (по умолчанию 1). Работает с целыми и дробными числами.
Если начальное число больше конечного при положительном шаге, результат - пустой массив. Для убывающей последовательности нужно указывать отрицательный шаг. Пример: range(10, 1, -1).
Цель: быстрое создание диапазона чисел, например, для перебора или генерации тестовых данных.
Как преобразовать массив строк, содержащих числа, в массив целых чисел?
$strings = ['10', '20', '30'];
$ints = array_map('intval', $strings);
print_r($ints);Array (
[0] => 10
[1] => 20
[2] => 30
)array_map применяет функцию intval к каждому элементу. Для дробных чисел используйте floatval.
intval обрезает дробную часть и может вернуть неожиданное значение для строк, начинающихся с числа (например, intval('12abc') вернет 12). Для строгой проверки используйте filter_var с флагом FILTER_VALIDATE_INT.
Цель: подготовка данных из внешних источников (CSV, JSON) к математическим операциям.
Как отсортировать массив чисел по возрастанию, сохраняя исходные ключи?
$numbers = [3, 1, 4, 1, 5, 9];
asort($numbers);
print_r($numbers);Array (
[1] => 1
[3] => 1
[0] => 3
[2] => 4
[4] => 5
[5] => 9
)asort сортирует по значениям, не меняя связь ключ-значение. Для сортировки по ключам используйте ksort.
Сортировка смешанных типов (числа и строки) может дать неожиданный порядок. Используйте флаг SORT_NUMERIC: asort($array, SORT_NUMERIC).
Цель: упорядочивание данных без потери ассоциативной связи.
Как оставить в массиве только числа, большие 10?
$numbers = [5, 12, 8, 20, 3];
$filtered = array_filter($numbers, function($value) {
return $value > 10;
});
print_r($filtered);Array (
[1] => 12
[3] => 20
)array_filter с callback позволяет задать любое условие. Ключи сохраняются; для переиндексации используйте array_values.
Без callback функция удаляет все элементы, которые при приведении к булеву типу становятся false, включая 0. Поэтому рекомендуется всегда передавать callback при фильтрации чисел.
Цель: выборка подмножества данных по критерию.
Как найти минимальное и максимальное число в массиве?
$numbers = [7, 2, 9, 4, 1];
$min = min($numbers);
$max = max($numbers);
echo "Min: $min, Max: $max";Min: 1, Max: 9
Функции min и max принимают массив или список аргументов.
При передаче пустого массива функции возвращают false и генерируют предупреждение. Перед вызовом проверьте массив через count.
Цель: получение граничных значений для анализа.
Как вычислить сумму квадратов чисел в массиве?
$numbers = [1, 2, 3, 4];
$sumSquares = array_reduce($numbers, function($carry, $item) {
return $carry + $item * $item;
}, 0);
echo $sumSquares; // 3030
array_reduce применяет callback к каждому элементу, накапливая результат. Третий аргумент - начальное значение.
Если не указать начальное значение, первый элемент массива станет $carry, что при пустом массиве приведет к ошибке. Всегда указывайте начальное значение, соответствующее типу операции.
Цель: кастомная агрегация данных (например, среднее, дисперсия).
Как вычислить произведение всех чисел в массиве?
$numbers = [2, 3, 4];
$product = array_product($numbers);
echo $product; // 2424
array_product быстро вычисляет произведение.
Для пустого массива возвращает 1, что может быть неочевидно. Если требуется другое поведение, проверяйте массив.
Цель: быстрое произведение для расчетов, например, при вычислении факториала.
Расширенные примеры работы с массивами чисел
Генерация последовательности Фибоначчи
function fibonacci($n) {
$fib = [0, 1];
for ($i = 2; $i < $n; $i++) {
$fib[] = $fib[$i-1] + $fib[$i-2];
}
return array_slice($fib, 0, $n);
}
print_r(fibonacci(10));Array
(
[0] => 0
[1] => 1
[2] => 1
[3] => 2
[4] => 3
[5] => 5
[6] => 8
[7] => 13
[8] => 21
[9] => 34
)Пояснение: динамическое расширение массива через [] и использование предыдущих элементов.
Скользящее среднее с окном 3
$data = [10, 12, 15, 13, 18, 20];
$window = 3;
$movingAvg = [];
for ($i = 0; $i <= count($data) - $window; $i++) {
$slice = array_slice($data, $i, $window);
$movingAvg[] = array_sum($slice) / $window;
}
print_r($movingAvg);Array
(
[0] => 12.333333333333
[1] => 13.333333333333
[2] => 15.333333333333
[3] => 17
)Пояснение: нарезка массива array_slice и суммирование.
Использование SplFixedArray для больших массивов
$size = 1000000;
$array = new SplFixedArray($size);
for ($i = 0; $i < $size; $i++) {
$array[$i] = $i * 2;
}
echo $array[500000]; // 10000001000000
SplFixedArray потребляет меньше памяти и быстрее для больших однородных массивов, так как не хранит хеш-таблицу ключей.
Поэлементное сложение двух массивов
$arr1 = [1, 2, 3, 4];
$arr2 = [10, 20, 30, 40];
$sum = array_map(function($a, $b) {
return $a + $b;
}, $arr1, $arr2);
print_r($sum);Array
(
[0] => 11
[1] => 22
[2] => 33
[3] => 44
)array_map с несколькими массивами позволяет выполнять поэлементные операции над несколькими наборами чисел.
Генератор для последовательности квадратов
function squareNumbers($start, $limit) {
for ($i = $start; $i <= $limit; $i++) {
yield $i * $i;
}
}
foreach (squareNumbers(1, 5) as $square) {
echo "$square ";
}
// 1 4 9 16 251 4 9 16 25
Генераторы экономят память при обработке больших последовательностей, так как значения вычисляются на лету.
Точное сложение чисел с плавающей точкой (bcmath)
$prices = ['19.99', '5.95', '12.50'];
$total = '0';
foreach ($prices as $price) {
$total = bcadd($total, $price, 2);
}
echo $total; // 38.4438.44
bcadd из расширения BCMath обеспечивает точность при сложении десятичных чисел, избегая ошибок округления float.
Умножение вектора на скаляр
$vector = [1, 2, 3, 4];
$scalar = 5;
$result = array_map(function($x) use ($scalar) {
return $x * $scalar;
}, $vector);
print_r($result);Array
(
[0] => 5
[1] => 10
[2] => 15
[3] => 20
)Использование use для замыкания на внешнюю переменную.