За последние 24 часа нас посетили 20137 программистов и 1077 роботов. Сейчас ищут 698 программистов ...

Преобразование типа переменной

Тема в разделе "PHP для новичков", создана пользователем sobachnik, 20 май 2011.

  1. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Какого фига?!?
    PHP:
    1. <?php
    2. $l = '4';
    3. echo(gettype($l) . '<br />');
    4. $n = array(
    5.     $l => 'asd'
    6. );
    7. foreach($n as $k => $v)
    8.     echo(gettype($k) . ' ' . gettype($v) . '<br />');
    9. ?>
    выдаёт
    Код (Text):
    1. string
    2. integer string
    Кто его просит так делать?
    Это на всех версиях так, или баг какой-то в моей версии php?...
     
  2. Alex_pac

    Alex_pac Активный пользователь

    С нами с:
    11 апр 2011
    Сообщения:
    285
    Симпатии:
    1
    Адрес:
    Россия, Тольятти
    php сам знает что делает. не мешай ему.
     
  3. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.553
    Симпатии:
    631
    очевидно, когда речь идет о ключах массива, все числа php приводит в int:
    PHP:
    1. <?php
    2. $i = 4;
    3. echo gettype($i),' - ';
    4. echo gettype(key(array($i => ''))),'<br>';
    5. $i = '4';
    6. echo gettype($i),' - ';
    7. echo gettype(key(array($i => ''))),'<br>';
    8. $i = 4.1;
    9. echo gettype($i),' - ';
    10. echo gettype(key(array($i => ''))),'<br>';
    11. $i = true;
    12. echo gettype($i),' - ';
    13. echo gettype(key(array($i => ''))),'<br>';
     
  4. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.553
    Симпатии:
    631
    Ключами массива могут быть только либо целочисленными, либо строками.
     
  5. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Ясно. Странно, какая ему разница, строки же могут быть ключами... Зачем он из строки число делает..? Мне же лучше знать, что я хочу видеть в качестве ключа массива - строку или число.
     
  6. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.553
    Симпатии:
    631
    вообще без шансов
    PHP:
    1. <?
    2. $i = 4;
    3. echo gettype(key(array((string)$i => ''))); // integer
     
  7. Alex_pac

    Alex_pac Активный пользователь

    С нами с:
    11 апр 2011
    Сообщения:
    285
    Симпатии:
    1
    Адрес:
    Россия, Тольятти
    вам не нравится как php работает с данными?
    а вам нравится то что вам не нужно НИКОГДА писать

    var $l : string;

    перед тем чтобы присвоить этой переменной значение?

    PHP автоматиечски ставит то тип который больше подходит.
    И также автоматически преобразовывает его если вы требуете от переменной действий которые специфичны какому либо типу данных.

    так что НЕ НУЖНО беспокоиться о том что там число а вы объявили строчку.

    PHP:
    1. <?php
    2. $l = '1';
    3. $d[$l] = 'hello';
    4. foreach ($d as $k => $dd) {
    5. if ($k = '1') { print $dd; }}
    6. foreach ($d as $k => $dd) {
    7. if ($k = 1) { print $dd; }}
    данный пример показывает универсальность типов php
     
  8. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Alex_pac,
    благодарю за ответ!
    Я не первый год уже занимаюсь программированием на php и такие вещи, как
    конечно, знаю.
    Но здесь от переменной никаких специфичных действий не требовалось. Просто нужно было создать массив с определёнными ключами и значениями.
    Иногда мне бывает нужно сравнивать переменные не только по значению, но и по типу, т.е. чтобы 2 было не равно "2". А в данном случае сиё сравнение работало неверно, я сперва не понял почему, потом вот выяснил, что php приводит строки к целым числам (если это возможно) при использовании в качестве ключа массива - строки, состоящей только из цифр. Может быть я не прав, но вот конкретно в данном случае такое приведение типа мне кажется лишним.
    [​IMG]
     
  9. Gromo

    Gromo Активный пользователь

    С нами с:
    24 май 2010
    Сообщения:
    2.786
    Симпатии:
    2
    Адрес:
    Ташкент
    sobachnik
    насколько я знаю, в пхп нет списков - только ассоциативные массивы. однако для того, чтобы иметь возможность работать и со списками, ключи массива преобразуются по возможности в integer тип, т.к. пхп изначально воспринимает любые данные как строку.
     
  10. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.553
    Симпатии:
    631
    это причина, по которой приводятся типы. Будем добавлять элемент в конец массива, сравните ключи, которые PHP выдаст второму элементу:
    PHP:
    1. <?php
    2. $a = array();
    3. $a['string'] = '1';
    4. $a[] = 1;
    5. print_r($a);
    PHP:
    1. <?php
    2. $a = array();
    3. $a[17] = 1;
    4. $a[] = 1;
    5. print_r($a);
     
  11. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.553
    Симпатии:
    631
    Ели бы 17 могло бы быть строкой, то во втором примере, второй элемент массива получил бы индекс 0, а не 18. И это означало бы так же, что у нас могло бы быть два элемента с индексом 17 - один int 17, другой string 17. И еще два - флоат и дубл =)