Это более глубокое погружение в предыдущий вопрос, который у меня был здесь: не могут ли элементы в ассоциативных массивах PHP численно (то есть по индексу)?
Согласно W3Schools,:
В PHP существует три типа массивов:
- Числовой массив – массив с числовым индексом
- Ассоциативный массив – массив, в котором каждый ключ ID связан со значением
- Многомерный массив. Массив, содержащий один или несколько массивов.
Но это точно? Каждому элементу массива может быть присвоен либо индекс, либо строка в качестве ключа – так что происходит, когда два смешаны в одном массиве?
$myArray[0] = 'value1'; $myArray['one'] = 'value2';
Все массивы в PHP одинаковы; они реализуются как хэш-карты, которые связывают ключи со значениями, независимо от типа ключей.
Руководство :
Индексированные и ассоциативные типы массивов являются одним и тем же типом в PHP, которые могут содержать как целые, так и строковые индексы.
Если массив имел как числовые, так и нечисловые индексы, я бы все же назвал его ассоциативным массивом. Значение «ассоциативного» все еще стоит.
Википедия :
Ассоциативный массив представляет собой абстрактный тип данных, состоящий из набора уникальных ключей и набора значений, где каждый ключ связан с одним значением (или набором значений).
…
С точки зрения компьютерного программиста ассоциативный массив можно рассматривать как обобщение массива. Хотя регулярный массив отображает целочисленный ключ (индекс) в значение произвольного типа данных, ключи ассоциативного массива также могут быть произвольно введены. В некоторых языках программирования, таких как Python, ключи ассоциативного массива даже не должны быть одного типа.
Для последнего предложения то же самое относится к PHP, как показано в вашем примере.
PHP не имеет массивов. Это словари. Цифровые клавиши допускаются одновременно с строковыми клавишами. Они могут смешиваться и сосуществовать.
(На самом деле строковые ключи типа «123» всегда рассматриваются как целые числа. PHP не сохраняет информацию о типе для них.)
Если вы хотите другое поведение, вы можете реализовать и расширить ArrayObject . И было бы возможно реализовать карту, где числовые ключи функционировали как псевдоним для строковых индексов.
В общем, вы должны прочитать официальную документацию, а не W3Schools .
Массив может содержать любые элементы, которые он хочет, с любыми ключами, которые он хочет.
Описание, предоставляемое W3Schools, довольно неоднозначно или даже ошибочно.
- Числовой массив – массив с числовым индексом
Я бы сказал, что числовой массив – это массив с целыми индексами. Массив с одним я, вероятно, назвал бы смешанным (или ассоциативным, см. Ниже) массив, если бы мне пришлось его называть.
- Ассоциативный массив – массив, в котором каждый ключ ID связан со значением.
Я не знаю об этом описании. Я бы сказал, что массив может быть ассоциативным, если он сопоставляет строки значениям вместо числовых индексов.
- Многомерный массив. Массив, содержащий один или несколько массивов. Нумерный массив. Массив с числовым индексом.
Ассоциативный массив также может содержать массивы, что делает его многомерным.
Имейте в виду, что массив со всеми цифровыми клавишами (даже если в строке) всегда будет рассматриваться как числовой массив. Это может означать разные вещи в разных контекстах.
$arr = array( '1' => 'abc', 2 => 'def' ); var_dump($arr);
array(2) { [1]=> string(3) "abc" [2]=> string(3) "def" }
Вы получаете ассоциативный массив. Попробуйте этот код:
$myArray[0] = 'value1'; $myArray['one'] = 'value2'; echo($myArray[1]);
Видеть? Это ничего не говорит.