Массивы чисел PHP: полное руководство

Раздел: PHP программирование -> Числа в PHP

Массив чисел в PHP: основные подходы

Как наиболее эффективно вычислить сумму элементов массива чисел?

$numbers = [10, 20, 30, 40, 50];
$sum = array_sum($numbers);
echo $sum; // 150
150

Функция 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; // 30
30

array_reduce применяет callback к каждому элементу, накапливая результат. Третий аргумент - начальное значение.

Если не указать начальное значение, первый элемент массива станет $carry, что при пустом массиве приведет к ошибке. Всегда указывайте начальное значение, соответствующее типу операции.

Цель: кастомная агрегация данных (например, среднее, дисперсия).

Как вычислить произведение всех чисел в массиве?

$numbers = [2, 3, 4];
$product = array_product($numbers);
echo $product; // 24
24

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]; // 1000000
1000000

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 25
1 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.44
38.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 для замыкания на внешнюю переменную.

Массив чисел в PHP - comments

En
массив чисел php (php)