Трескотня пустая.
Массив в PHP - это упорядоченное отображение, которое устанавливает соответствие между значением и ключом. Этот тип оптимизирован в нескольких направлениях, поэтому вы можете использовать его как собственно массив, список (вектор), хэш-таблицу (являющуюся реализацией карты), словарь, коллекцию, стэк, очередь и т.п. Ключ может быть либо типа integer, либо типа string. Значение может быть любого типа. Дополнительно с ключом будут сделаны следующие преобразования: ◦ Строки, содержащие целое число будут преобразованы к типу integer. Например, ключ со значением "8" будет в действительности сохранен со значением 8. С другой стороны, значение "08" не будет преобразовано, так как оно не является корректным десятичным целым. ◦ Числа с плавающей точкой (тип float) также будут преобразованы к типу integer, т.е. дробная часть будет отброшена. Например, ключ со значением 8.7 будет в действительности сохранен со значением 8. ◦ Тип bool также преобразовываются к типу integer. Например, ключ со значением true будет сохранен со значением 1 и ключ со значением false будет сохранен со значением 0. ◦ Тип null будет преобразован к пустой строке. Например, ключ со значением null будет в действительности сохранен со значением "". ◦ Массивы (тип array) и объекты (тип object) не могут использоваться в качестве ключей. При подобном использовании будет генерироваться предупреждение: Недопустимый тип смещения (Illegal offset type). Если несколько элементов в объявлении массива используют одинаковый ключ, то только последний будет использоваться, а все другие будут перезаписаны. Тоже самое будет и в JS, если var o = {1: 1, '1': 2}, то в результате будет одно свойство со значением 2. И речь шла о массивах и объектах. JS, это не нечто исключительное, в других языках тоже всякой хрени полно, сравнивать их, это если делать нехер и времени свободного хоть отбавляй, а если охота, пожалуйста. |
Цитата:
А вот объект языка программирования (даже если говорить о языках с нестрогой типизацией), который можно рассматривать как коллекцию пар (строка, значение), как раз не делает различия между числом и строками с этим числом — происходит приведение имени свойства/поля/метода к строковому значению. Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
Цитата:
Вот класс DS\Map в PHP — это действительно работает как ассоциативный массив, имеет методы для работы с ним. (Также Map в JS, Dictionary в C#, HashMap в Java и пр.) А то, что в PHP возвращает array() — это даже не массив (некоторые там разглядели список, вектор, хэш-таблицу, словарь, коллекцию, стэк, очередь), а просто динамический объект, у которого даже нет своих методов для работы... Этот динамический объект можно расширять какими угодно свойствами, массивом он от этого не станет. Этот динамический объект некоторым кажется массивом, однако стоит учитывать, что он таким кажется от того, что его передают в различные глобальные функции типа array_*, count и пр. которые имитируют работу этого т. н. «массива»/«ассоциативного массива»/«вектора» и пр. Цитата:
Цитата:
<?php $a = new DS\Map(); $a -> put(3, 1); $a -> put('3', 2); print_r($a); // Ds\Map Object // ( // [0] => Ds\Pair Object // ( // [key] => 3 // [value] => 1 // ) // [1] => Ds\Pair Object // ( // [key] => 3 // [value] => 2 // ) // ) print_r($a -> count()); // 2 Цитата:
|
Пурга словесная, ведь изначально речь шла только о массивах и объектах. А ассоицатитвный массив, это ни как не 1 и "1" ключи, это "a", "b", ... ключи. И такой массив, наряду с индексным, имеет тот же набор функций, а в JS "аналог" нет, ибо это объект. А "просто динамический объект, у которого даже нет своих методов для работы...", это воспаленный бред, если только не рассматривать его как и "есть ли определение индекса в js массиве" для словоблудия.
Кроме этого результат работы функций может отличаться от типа ключей массива. Хотя это может и показаться странным, но такое поведение имеет плюсы, например при объединении запросов в БД. Любишь ты языком чесать, надоел уже. |
Цитата:
Если что-то соответствует определению ассоциативного массива, значит оно им и является. Всё остальное - такая же демагогия, как и про отсутствие понятия индексов в javascript: Цитата:
Цитата:
|
laimas, Белый шум, смотрите, я например в С# (Unity3D) могу описать отношения между игроком (класс GameObject) и питомцем (класс GameObject)
var pets = new Dictionary<GameObject, GameObject>();T. е. в качестве ключей используется экземпляр класса GameObject. И зная игрока, я могу получить его питомца. Теория теорией, однако на практике это в PHP не работает... <?php class GameObject { public $name; function __construct($name) { $this->name = $name; } } $laimas = new GameObject("laimas"); $cock = new GameObject("петушок — золотой гребешок"); $malleys = new GameObject("Malleys"); $dino = new GameObject("T-rex"); $pets = [ $laimas => $cock, $malleys => $dino ]; print_r($pets); Код:
PHP Warning: Illegal offset type in php-omg.php on line 18 |
Цитата:
|
Цитата:
Зачем вообще в РНР упоминается в связи с [] или array() название ассоциативный массив — неясно, почему нельзя называть вещи своими именами — динамический объект, экспандо (оно ведь и есть объект-распашонка) или расширяемый null. Функции json_encode и json_decode могут показать это! [] или array() не могут произвести ничего такого, чего нельзя было бы представить при помощи JSON. Цитата:
Код:
php > print_r((string)247 > '0000247' ? 'Это норма — говорит PHP' : 'Нет'); Код:
php > print_r(-4.8 > NULL ? 'Это норма — говорит PHP' : 'Нет'); Много ещё есть вещей типа «Это норма — говорит PHP», однако однажды случилось такое... Я думаю, что в PHP стоило ожидать, что нечто такое произойдёт — T_PAAMAYIM_NEKUDOTAYIM. Если в традиционных языках написали бы в ошибке T_DOUBLE_COLON, то в PHP проявляется неконсистентность даже среди языков, на которых именуются операторы языка. Это означает, что в PHP... Ах, простите, «Разработчики PHP считают, что не означает...» Это норма — говорит PHP. |
Цитата:
В тех определениях, которые встречались мне, говорилось либо о ключах-строках, либо о самом понятии ассоциативности: т.е. если массив заточен не на последовательные числа, а на произвольные значения в ключах (любого типа), то его можно назвать ассоциативным (иными словами, если массив поддерживает только объекты в качестве ключей, то он всё-равно ассоциативный). http://kvodo.ru/associative-array.html |
Белый шум, это всё верно и статья хорошая (с примером на C++ — map <string, string> library;). Но причём тут PHP?
PHP с его объектом совсем не соответствует тому, что там описано... Берём null ($notDefined не объявлен) и расширяем его... Код:
php > $notDefined['notDefined'][2]['person']['isCrazy'] = TRUE; |
Malleys,Просто найдите общее определение ассоциативного массива, которое соответствует вашему пониманию, и на этом закончим.
|
Часовой пояс GMT +3, время: 04:33. |