Являются ли числовые и ассоциативные массивы в PHP двумя разными способами?

Это более глубокое погружение в предыдущий вопрос, который у меня был здесь: не могут ли элементы в ассоциативных массивах 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]); 

Видеть? Это ничего не говорит.