Показать сообщение отдельно
  #33 (permalink)  
Старый 15.04.2020, 15:01
Аватар для Malleys
Профессор
Отправить личное сообщение для Malleys Посмотреть профиль Найти все сообщения от Malleys
 
Регистрация: 20.12.2009
Сообщений: 1,714

Сообщение от Белый шум
Нет такого правила, что ассоциативный массив обязан различать числа от строк с этим числом.
Однако в большинстве языков программирования (если говорить об ассоциативных массивах) такое различие делается, т. к. числа и строки — это разные типы.

А вот объект языка программирования (даже если говорить о языках с нестрогой типизацией), который можно рассматривать как коллекцию пар (строка, значение), как раз не делает различия между числом и строками с этим числом — происходит приведение имени свойства/поля/метода к строковому значению.

Сообщение от Белый шум
Для языков с нестрогой типизацией такое поведение является ожидаемым.
Совершенно нет! Просто вы путаете динамический объект/объект представляющий класс с ассоциативным массивом.

Сообщение от laimas
Ключ может быть либо типа integer, либо типа string. Значение может быть любого типа.
Ключ типа integer неявно приводится к строке, поскольку вы не можете использовать такой же ключ типа string. То, что вы описали — это объект языка программирования. Учитывая, что можно менять его свойства как угодно — это как dynamic object в C# или Object.create(null) в JS.

Сообщение от laimas
Дополнительно с ключом будут сделаны следующие преобразования:
Сообщение от laimas
т.е. дробная часть будет отброшена.
Сообщение от laimas
Тип bool также преобразовываются к типу integer.
Сообщение от laimas
Массивы (тип array) и объекты (тип object) не могут использоваться в качестве ключей.
И как такое может называться ассоциативным массивом в PHP? Какое тут может быть соответствие одного значения (ключа) к другому значению, когда ключи безвозвратно утрачивают информацию, порождая коллизии?

Вот класс DS\Map в PHP — это действительно работает как ассоциативный массив, имеет методы для работы с ним. (Также Map в JS, Dictionary в C#, HashMap в Java и пр.)

А то, что в PHP возвращает array() — это даже не массив (некоторые там разглядели список, вектор, хэш-таблицу, словарь, коллекцию, стэк, очередь), а просто динамический объект, у которого даже нет своих методов для работы... Этот динамический объект можно расширять какими угодно свойствами, массивом он от этого не станет.

Этот динамический объект некоторым кажется массивом, однако стоит учитывать, что он таким кажется от того, что его передают в различные глобальные функции типа array_*, count и пр. которые имитируют работу этого т. н. «массива»/«ассоциативного массива»/«вектора» и пр.

Сообщение от laimas
Тоже самое будет и в JS, если var o = {1: 1, '1': 2}, то в результате будет одно свойство со значением 2.
Конечно — это же динамический объект, как array() в PHP.

Сообщение от Белый шум
Поддержка ассоциативных массивов есть во многих интерпретируемых языках программирования высокого уровня... PHP
Да, действительно есть!
<?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


Сообщение от Белый шум
обязан различать числа от строк с этим числом
Это вы наверное пристально вглядываетесь в вывод от print_r — он действительно не различает строки и числа, как в примере выше, но сами объекты правильного типа!
Ответить с цитированием