Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > индекс массива 0 == '0'


Автор: bars80080 12.9.2008, 10:21
Код

<?php
$a = array();
$a[0] = 15;
$a['0'] = 'we';
var_dump($a);

echo $a[0];
?>

я честно говоря удивлён, $a[0] == $a['0']

неужели с этим ничего нельзя поделать?

Автор: SergeCpp 12.9.2008, 10:39
Об этом же написано в http://php.net/manual/en/language.types.array.php
Цитата
A key may be either an integer or a string. If a key is the standard representation of an integer, it will be interpreted as such (i.e. "8" will be interpreted as 8, while "08" will be interpreted as "08"). Floats in key are truncated to integer. The indexed and associative array types are the same type in PHP, which can both contain integer and string indices.


P.S. (там же) Example #1 Using array()
Код
$switching = array( 10,         // key = 0
                    5    =>  6,
                    3    =>  7, 
                    'a'  =>  4,
                            11, // key = 6 (maximum of integer-indices was 5)
                    '8'  =>  2, // key = 8 (integer!)
                    '02' => 77, // key = '02'
                    0    => 12  // the value 10 will be overwritten by 12
                  );


Автор: bars80080 12.9.2008, 11:25
м-да, не есть гуд

Автор: Sunvas 12.9.2008, 13:31
Цитата(bars80080 @  12.9.2008,  11:25 Найти цитируемый пост)
м-да, не есть гуд

Почему? Вроде как логично.

Автор: bars80080 12.9.2008, 13:43
ну, как. допустим я делаю массив имён файлов, что находятся в директории. как просто было бы - численные индексы: имена файлов, ассоциативные: имена директорий. а так приходится указывать ещё и тип. 

но это просто пример под конкретную задачу. суть всё же, что было бы хорошо иметь разделение, а так происходит замещение

Автор: gta4kv 12.9.2008, 14:41
bars80080, 

И вообще, если тебе нужны численные индексы, почему нельзя писать:
Код

<?php
$my = array( "null", "one", "two", "three" => "zero" );
echo $my[ 0 ];
?>

????

Добавлено @ 14:43
Хотя смысла в этом не вижу, использовать слова было бы разумнее, и понятнее через год smile)

Автор: bars80080 12.9.2008, 16:21
та нет, вопрос не в том что можно извернуться если захотеть

я узнал о таком факте, только когда захотел вычитать каталог файлов на любую глубину. и чтобы провести простое разбиение на файлы и каталоги хотел задать в массиве первые численными индексами, а вторые строками.

но фиг с ним, важно, что по сути $a[0] $a['0'] - вообще-то не одно и то же. когда мы указываем какие-то обработки или формирования, мы всегда знаем с какими ключами имеем дело. если первые я могу пересчитать в цикле for(), то вторые нет. ну, != это и есть != . пусть у пхп есть разные степени сравнения, но здесь-то хотя бы могли жёстко определить

Автор: bobik02 12.9.2008, 16:44
Цитата(bars80080 @  12.9.2008,  16:21 Найти цитируемый пост)
если первые я могу пересчитать в цикле for(), то вторые нет

что в этом контексте значит "первые...вторые" ?

Автор: nerezus 12.9.2008, 16:56
Цитата

м-да, не есть гуд
 Это написано было в документации и на это есть соотв. вопросы в Zend Cert.

Автор: bars80080 12.9.2008, 17:28
Цитата(nerezus @  12.9.2008,  16:56 Найти цитируемый пост)
Это написано было в документации и на это есть соотв. вопросы в Zend Cert. 

?


это же не делает гуд

Цитата(bobik02 @  12.9.2008,  16:44 Найти цитируемый пост)
что в этом контексте значит "первые...вторые" ? 

первые - численные ключи, вторые - ассоциативные

Автор: bobik02 12.9.2008, 18:05
Цитата(bars80080 @  12.9.2008,  17:28 Найти цитируемый пост)
первые - численные ключи, вторые - ассоциативные 

тогда и первые и вторые ты сможешь пересчитать итеративно .

Автор: bars80080 12.9.2008, 18:12
bobik02, да вопрос не в пересчёте, а в том, что внесение в массив жлемента с ассоциативным ключом, он легко может вытеснить элемент с численным ключом

Автор: Sunvas 12.9.2008, 19:17
bars80080, ну так заведи два массива! Чего все в один пихать?

Автор: bars80080 12.9.2008, 19:49
одно дерево - один массив. или сколько я должен создать массивов для каталога с глубиной в пять уровней?

Автор: skyboy 12.9.2008, 20:06
Цитата(bars80080 @  12.9.2008,  12:43 Найти цитируемый пост)
как просто было бы - численные индексы: имена файлов, ассоциативные: имена директорий. а так приходится указывать ещё и тип. 

как просто было бы: ассоциативный массив, ключ - имя файла/папки. в элементах, соответствующих папке, кроме элементов "dateCreated" и "dateUpdated" есть элемент-массив "children" - вложенный папки и файлы. и обходись одним деревом.

Автор: Mal Hack 12.9.2008, 20:16
Цитата(bars80080 @  12.9.2008,  12:25 Найти цитируемый пост)
м-да, не есть гуд 

Что значит не есть ГуД? Машина в принципе не может использовать ассоциативные массивы. Все индекса все равно числа. Например в С++ std::map, делает взаимного соответствие между массивом ключей и значений...
Это матчасть. То, что все, чтобы вы не передали в PHP в качестве аргумента оператора [] будет неявно преобразовываться в int. Матчасть из С++ - int by default...

Автор: bars80080 12.9.2008, 20:43
но как-то же извлекается разница между:
Код

if('0' === 0) { }

?

Автор: gta4kv 12.9.2008, 20:54
bars80080, ковычки?

Автор: Mal Hack 12.9.2008, 20:55
bars80080, я думаю поймешь, что написано в  документации, если я правильно понял в чем твой вопрос заключается.
http://www.php.net/manual/en/language.operators.comparison.php
Цитата
$a === $b  Identical  TRUE if $a is equal to $b, and they are of the same type. (introduced in PHP 4)

If you compare an integer with a string, the string is converted to a number. If you compare two numerical strings, they are compared as integers. These rules also apply to the switch statement.



Вообще, все это из-за нулевой типизации в PHP....

Автор: bars80080 12.9.2008, 21:14
вооот, жаль что именно жёсткое сравнивание типов не применяется в массивах. конечно, хорошо было бы, если б можно было самому задавать, но если уж выбирать в этом случае, я бы выбрал жёсткий

Автор: Mal Hack 12.9.2008, 21:43
Ну вот это гребанная политика PHP... Поэтому он - недоязык...

Автор: skyboy 12.9.2008, 22:23
Цитата(bars80080 @  12.9.2008,  20:14 Найти цитируемый пост)
жаль что именно жёсткое сравнивание типов не применяется в массивах

а что  в качестве индекса нельзя использовать массив или объект нельзя - не "жалко"?
Цитата(Mal Hack @  12.9.2008,  20:43 Найти цитируемый пост)
Поэтому он - недоязык... 

в смысле? Тьюринг-неполный?

Автор: bars80080 12.9.2008, 22:28
Цитата(skyboy @  12.9.2008,  22:23 Найти цитируемый пост)
а что  в качестве индекса нельзя использовать массив или объект нельзя - не "жалко"?
можно, но здесь уже проще использовать численный массив, в котором каждый элемент содержит массив характеристик, в т.ч. и продожение дерева, если ветвится дальше

но хотелось ещё проще

Автор: Mal Hack 12.9.2008, 23:34
Цитата(skyboy @  12.9.2008,  23:23 Найти цитируемый пост)
в смысле? Тьюринг-неполный? 

Нет типизации.

Автор: nerezus 13.9.2008, 08:54
Цитата

это же не делает гуд
 Это как раз гут, т.к. всегда одинаковое поведение типизации.

Цитата

Нет типизации.
 
Цитата

Поэтому он - недоязык...
 а кто таких глупостей наговорил то тебе?  smile 

Типизация есть, и она вполне себе dynamic и weak(контроль типов).
Хотя я предпочитаю dynamic strong(кстати наш препод по ООП был уверен, что не бывает такой) на примере python.

Что касается недоязыка - то он может ВСЕ в своей области. В том числе и полноценное ООП.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)