Массивы в PHP: все об индексах и ключах

Раздел: Разработка на PHP -> Работа с массивами

Массивы в PHP представляют собой упорядоченные коллекции элементов, каждый из которых имеет уникальный идентификатор - индекс (ключ). Понимание того, как работают индексы, необходимо для эффективного управления данными.

Типы индексов и их особенности

Индексы могут быть целочисленными (числовые массивы) или строковыми (ассоциативные массивы). PHP автоматически присваивает целочисленные индексы, начиная с 0, если индекс не указан явно. При добавлении элемента без индекса PHP использует максимальный целочисленный ключ, увеличенный на 1.

Как переиндексировать массив в непрерывный числовой ряд после удаления элементов?

Наиболее эффективный способ - использовать функцию array_values(). Она возвращает все значения исходного массива с новыми числовыми индексами, начиная с нуля, сохраняя порядок.


<?php
$array = [10 => 'a', 20 => 'b', 30 => 'c'];
$reindexed = array_values($array);
print_r($reindexed);
?>

содержимое массива php (php вывод содержимого массива)

Array
(
    [0] => a
    [1] => b
    [2] => c
)

массив содержит php (php проверка наличия элемента в массиве)

Проблема: исходные ключи теряются. Если нужны старые ключи, их нужно сохранить отдельно.

Как переиндексировать массив с помощью цикла foreach?

Можно вручную создать новый массив, перебирая элементы исходного и присваивая новые индексы.


<?php
$array = [10 => 'a', 20 => 'b', 30 => 'c'];
$new = [];
$i = 0;
foreach ($array as $value) {
    $new[$i++] = $value;
}
print_r($new);
?>

Php между значениями (выборка значений массива в диапазоне php)

Array
(
    [0] => a
    [1] => b
    [2] => c
)

Php есть ли значение в массиве (поиск значения в массиве php)

Ошибки: не учитываются строковые ключи, сложно поддерживать при длинных вложенных конструкциях.

Как сбросить индексы с помощью array_merge?

Вызов array_merge() без аргументов или с одним пустым массивом также переиндексирует числовые ключи.


<?php
$array = [10 => 'a', 20 => 'b', 30 => 'c'];
$merged = array_merge($array);  // или array_merge([], $array)
print_r($merged);
?>

Php значение массива в строку (преобразование массива в строку php)

Array
(
    [0] => a
    [1] => b
    [2] => c
)

цикл значений php (цикл по массиву в php)

Важно: array_merge перезаписывает строковые ключи одинаковых имен, а числовые ключи переиндексируются. Это может привести к неожиданному поведению при смешанных ключах.

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

Индексы указываются после оператора =>:


<?php
$arr = [
    5 => 'пять',
    'key' => 'значение',
    -1 => 'отрицательный',
];
print_r($arr);
?>

Php проверить массив (проверить, является ли переменная массивом в php)

Array
(
    [5] => пять
    [key] => значение
    [-1] => отрицательный
)

Php new array (создание массива в php)

Типичная ошибка: ключ true преобразуется в 1, false в 0, null в пустую строку. Ключи чисел с плавающей точкой отбрасывают дробную часть.


<?php
$arr = [true => 'a', false => 'b', 1.5 => 'c', null => 'd'];
var_dump($arr);
?>

Php array access (доступ к элементам массива в php)

array(3) {
  [1] => string(1) "c"
  [0] => string(1) "b"
  [""] => string(1) "d"
}
(Обратите внимание: true (1) перезаписался ключом 1 от 1.5, осталось только "c" от 1.5)

Php объединить два массива (объединение двух массивов в php)

Как узнать все ключи массива?

Функция array_keys() возвращает массив, содержащий все ключи исходного массива.


<?php
$arr = ['a' => 1, 'b' => 2, 'c' => 3];
$keys = array_keys($arr);
print_r($keys);
?>

Php удалить первый элемент массива (php удалить первый элемент массива)

Array
(
    [0] => a
    [1] => b
    [2] => c
)

Php удалить элемент массива по значению (php удалить элемент массива по значению)

Если передать вторым аргументом значение, array_keys вернет только ключи, соответствующие этому значению. Будьте внимательны: сравнение нестрогое (==), что может привести к непредвиденным совпадениям.

Как проверить существование индекса перед обращением?

Используйте isset() или array_key_exists(). Первая проверяет, что ключ существует и значение не null.


<?php
$arr = ['a' => 1, 'b' => null];

if (isset($arr['b'])) {
    echo 'Ключ b существует и не null';
} else {
    echo 'Ключ b не существует или равен null';
}

if (array_key_exists('b', $arr)) {
    echo 'Ключ b существует';
}
?>

Php длина массива (длина массива php)

Ключ b не существует или равен null
Ключ b существует

Ошибка: обращение к несуществующему индексу ($arr['unknown']) вызывает предупреждение Undefined array key в PHP 8.0+.

Цели использования перечисленных вариантов зависят от контекста. array_values идеален для подготовки данных к сериализации (JSON) или перед передачей в функции, ожидающие индексированный массив. Циклы удобны при тонкой настройке. array_merge применяют при объединении массивов. Знание правил преобразования ключей помогает избежать трудноуловимых багов.

- Array index php (индекс массива в php)
- Index php sort (сортировка в php)
- Php array replace (array_replace - замена элементов массива в php)

Расширенные примеры работы с индексами массивов

Пример 1: Переиндексация после удаления элементов с array_slice

array_slice по умолчанию сохраняет ключи, но с флагом true (preserve_keys) или без него. Если нужно переиндексировать часть массива, лучше комбинировать с array_values.

Пример

<?php
$arr = [0 => 'a', 1 => 'b', 5 => 'c', 10 => 'd'];
$slice = array_slice($arr, 1, 2);  // элементы с индексами 1 и 5, ключи сохранены
print_r($slice);

$reindexed = array_values($slice);
print_r($reindexed);
?>
Array
(
    [1] => b
    [5] => c
)
Array
(
    [0] => b
    [1] => c
)

Пример 2: Автоматическая индексация при добавлении элементов

PHP добавляет новые элементы с индексом, равным максимальному целочисленному ключу + 1, даже если существуют пропуски.

Пример

<?php
$arr = [0 => 'a', 2 => 'b', 5 => 'c'];
$arr[] = 'd';
print_r($arr);
?>
Array
(
    [0] => a
    [2] => b
    [5] => c
    [6] => d
)

Пример 3: Преобразование строковых индексов в числовые

Иногда требуется превратить ассоциативный массив в индексированный, но строковые ключи могут быть числами в строке.

Пример

<?php
$assoc = ['10' => 'a', '20' => 'b'];
$indexed = array_values($assoc);
print_r($indexed);

// Но если ключи - числа в виде строк, PHP хранит их как целые числа
$arr = [10 => 'a', '20' => 'b'];
var_dump(array_keys($arr));
?>
Array
(
    [0] => a
    [1] => b
)
array(2) {
  [0] => int(10)
  [1] => int(20)
}

Пример 4: Использование отрицательных ключей

PHP допускает отрицательные индексы. Они не влияют на автоматическую индексацию положительными числами.

Пример

<?php
$arr = [-5 => 'минус пять', -3 => 'минус три'];
$arr[] = 'новый';  // новый ключ = 0, потому что максимальный положительный ключ не определен, PHP считает максимальным 0?
print_r($arr);
?>
Array
(
    [-5] => минус пять
    [-3] => минус три
    [0] => новый
)

Пример 5: Фильтрация массива с сохранением ключей и переиндексацией

array_filter сохраняет ключи. Чтобы получить непрерывный числовой ряд, применяют array_values после фильтрации.

Пример

<?php
$arr = [0 => 10, 1 => 0, 2 => 20, 3 => false];
$filtered = array_filter($arr, function($v) { return $v !== false; });
print_r($filtered);

$reindexed = array_values($filtered);
print_r($reindexed);
?>
Array
(
    [0] => 10
    [2] => 20
)
Array
(
    [0] => 10
    [1] => 20
)

Пример 6: Использование array_flip для обмена ключей и значений

Функция array_flip меняет местами ключи и значения. Значения должны быть строками или целыми числами; дублирующиеся значения приведут к перезаписи.

Пример

<?php
$original = ['a' => 1, 'b' => 2, 'c' => 3];
$flipped = array_flip($original);
print_r($flipped);

// Если значения не уникальны
$duplicate = ['a' => 1, 'b' => 1];
$flipped2 = array_flip($duplicate);
print_r($flipped2);
?>
Array
(
    [1] => a
    [2] => b
    [3] => c
)
Array
(
    [1] => b
)

Пример 7: Неявное приведение ключей при операциях с массивами

При сложении массивов (+) или сравнении ключи обрабатываются по правилам. Сложение не переиндексирует, а дополняет недостающими ключами.

Пример

<?php
$a = [0 => 'a', 1 => 'b'];
$b = [1 => 'c', 2 => 'd'];
$combined = $a + $b;
print_r($combined);
?>
Array
(
    [0] => a
    [1] => b
    [2] => d
)
(Ключ 1 из $b игнорируется, так как $a уже его содержит)

Индекс массива в PHP - comments

En
Array index php (php)