Какого фига?!? PHP: <?php $l = '4'; echo(gettype($l) . '<br />'); $n = array( $l => 'asd' ); foreach($n as $k => $v) echo(gettype($k) . ' ' . gettype($v) . '<br />'); ?> выдаёт Код (Text): string integer string Кто его просит так делать? Это на всех версиях так, или баг какой-то в моей версии php?...
очевидно, когда речь идет о ключах массива, все числа php приводит в int: PHP: <?php $i = 4; echo gettype($i),' - '; echo gettype(key(array($i => ''))),'<br>'; $i = '4'; echo gettype($i),' - '; echo gettype(key(array($i => ''))),'<br>'; $i = 4.1; echo gettype($i),' - '; echo gettype(key(array($i => ''))),'<br>'; $i = true; echo gettype($i),' - '; echo gettype(key(array($i => ''))),'<br>';
Ясно. Странно, какая ему разница, строки же могут быть ключами... Зачем он из строки число делает..? Мне же лучше знать, что я хочу видеть в качестве ключа массива - строку или число.
вам не нравится как php работает с данными? а вам нравится то что вам не нужно НИКОГДА писать var $l : string; перед тем чтобы присвоить этой переменной значение? PHP автоматиечски ставит то тип который больше подходит. И также автоматически преобразовывает его если вы требуете от переменной действий которые специфичны какому либо типу данных. так что НЕ НУЖНО беспокоиться о том что там число а вы объявили строчку. PHP: <?php $l = '1'; $d[$l] = 'hello'; foreach ($d as $k => $dd) { if ($k = '1') { print $dd; }} foreach ($d as $k => $dd) { if ($k = 1) { print $dd; }} данный пример показывает универсальность типов php
Alex_pac, благодарю за ответ! Я не первый год уже занимаюсь программированием на php и такие вещи, как конечно, знаю. Но здесь от переменной никаких специфичных действий не требовалось. Просто нужно было создать массив с определёнными ключами и значениями. Иногда мне бывает нужно сравнивать переменные не только по значению, но и по типу, т.е. чтобы 2 было не равно "2". А в данном случае сиё сравнение работало неверно, я сперва не понял почему, потом вот выяснил, что php приводит строки к целым числам (если это возможно) при использовании в качестве ключа массива - строки, состоящей только из цифр. Может быть я не прав, но вот конкретно в данном случае такое приведение типа мне кажется лишним.
sobachnik насколько я знаю, в пхп нет списков - только ассоциативные массивы. однако для того, чтобы иметь возможность работать и со списками, ключи массива преобразуются по возможности в integer тип, т.к. пхп изначально воспринимает любые данные как строку.
это причина, по которой приводятся типы. Будем добавлять элемент в конец массива, сравните ключи, которые PHP выдаст второму элементу: PHP: <?php $a = array(); $a['string'] = '1'; $a[] = 1; print_r($a); PHP: <?php $a = array(); $a[17] = 1; $a[] = 1; print_r($a);
Ели бы 17 могло бы быть строкой, то во втором примере, второй элемент массива получил бы индекс 0, а не 18. И это означало бы так же, что у нас могло бы быть два элемента с индексом 17 - один int 17, другой string 17. И еще два - флоат и дубл =)