Ключ масиву в 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.