- Опубликовано: 25 июл 2025
- 38
Ловушки и особенности поведения PHP-массивов
⚠️ 1. Строки, похожие на числа, приводятся к числам
$array = [
'01' => 'one',
1 => 'uno',
];
print_r($array);
Результат:
Array
(
[1] => uno
)
🔎 Почему? Потому что '01'
→ 1
(PHP считает это числом), и второй элемент затирает первый. В ассоциативной структуре ключи должны быть уникальными.
⚠️ 2. Добавление []
всегда даёт числовой ключ
$array = [];
$array['foo'] = 'bar';
$array[] = 'baz'; // ← добавит под числовым ключом
print_r($array);
Результат:
Array
(
[foo] => bar
[0] => baz
)
📌 Важно: []
не "продолжает" последний ключ — он ищет максимальный числовой ключ и увеличивает на 1. Даже если до этого были только строковые.
⚠️ 3. Сброс ключей при array_values()
$array = [
'id' => 123,
'name' => 'Alice',
];
$values = array_values($array);
print_r($values);
Результат:
Array
(
[0] => 123
[1] => Alice
)
🔎 Все ключи сброшены. Это частая ошибка: после pluck()
, map()
, values()
в Laravel — будьте осторожны с потерей ключей.
⚠️ 4. Перемешанные ключи — всё равно OK
$array = [
0 => 'a',
'foo' => 'b',
1 => 'c',
'bar' => 'd',
];
foreach ($array as $key => $value) {
echo "$key => $value\n";
}
Результат:
0 => a
foo => b
1 => c
bar => d
✅ PHP разрешает любые типы ключей в одном массиве.
⚠️ 5. JSON может всё испортить
$data = [
'01' => 'one',
'02' => 'two',
];
echo json_encode($data);
Результат:
{"1":"one","2":"two"}
🔴 Строки '01'
, '02'
становятся просто "1"
, "2"
— потому что JSON не различает строковые и числовые ключи, если это цифры.
📌 Laravel часто использует json_encode()
/response()->json()
, так что будь внимателен, если важны именно формат и ведущие нули в ключах.
📘 Итог
📌 Важно знать при работе с: JSON, merge, ключами - Строки-числа становятся числами
📌 Важно знать при: генерации массивов - [] всегда добавляет числовой ключ
📌 Важно знать при: итерации по массиву - Ключи могут быть перемешаны
📌 Важно знать при: фильтрации - array_values() сбрасывает ключи
📌 Важно знать при: использовании API, сериализации - JSON ломает ключи с ведущими нулями
Была статья полезной: