Увійти Реєстрація
Блог Серії
Кар'єра
Вакансії Компанії
Навчання
Документація Співбесіди Тестування Відео
Екосистема
Пакети Ресурси Проєкти Інструменти Події
Інше
Про нас Реклама

Чому ключі масиву '1' і 1 - це той самий ключ і які ще приведення ключів бувають?

Ключ масиву в PHP може бути лише int або string. Усе інше приводиться, і деякі рядки теж:

  • Рядок з десятковим цілим числом ('1', '-5') стає цілим: '1' і 1 - один ключ.
  • Рядок з ведучим нулем чи пробілом ('01', ' 1') лишається рядком.
  • float обрізається до цілого: 1.7 → 1 (з PHP 8.1 - з попередженням про втрату точності).
  • bool стає 0 або 1.
  • null стає порожнім рядком ''.
  • Масиви й об'єкти як ключі - помилка (TypeError), зокрема й enum.
$a = ['1' => 'a', 1 => 'b', true => 'c', '01' => 'd'];
// [1 => 'c', '01' => 'd'] - перші три записи перезаписали один одного

Де це кусає:

  • Ідентифікатори-рядки: масив з ключами '007' і '7' - два ключі, а з '7' і 7 - один.
  • array_merge перенумеровує числові ключі. Масив [10 => 'Київ', 20 => 'Львів'], де ключі - ID міст, після array_merge стане [0 => 'Київ', 1 => 'Львів']. Рядкові ключі, схожі на числа, - теж числові, тож проблема та сама.
  • JSON: json_encode масиву з ключами 0, 1, 2 дає масив [...], а з «дірками» (0, 2) - об'єкт {"0":..,"2":..}. Клієнт отримає інший тип даних.
  • in_array / array_search без третього параметра true порівнюють через ==.

Порада: для словників зі «справжніми» рядковими ключами, де ці правила заважають, - SplObjectStorage, Map з ds-розширення чи колекції з явними ключами; для ID - не покладатися на перенумерацію і використовувати + чи array_replace замість array_merge.

Докладніше в документації: Масиви: ключі

Перевір себе

20 випадкових питань за спробу, після завершення - розбір кожної помилки

Схожі питання