За последние 24 часа нас посетили 61303 программиста и 1778 роботов. Сейчас ищут 827 программистов ...

Странности во вложенных массивах

Тема в разделе "PHP для новичков", создана пользователем Kreker, 10 дек 2008.

  1. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    Имеется многомерный массив, вложенностью где-то 5.
    Вторая вложенность выглядит где-то так:
    Код (Text):
    1.  
    2. Array
    3. (
    4.     [Подложка] => Array
    5.         (
    6.             [sds1] => Array
    7.                 (
    8.                     [id] => 7
    9.                     [p_type] => 7
    10. .............................
    11.  
    12.                 )
    13.        
    14.         )
    15.  
    16.     [Плинтус] => Array
    17.         (
    18.             [id] => 8
    19.         )
    20.  
    21.     [12] => Array
    22.         (
    23.             [id] => 9
    24.         )
    25.  
    26. )
    Этот массив обрабатывается в foreach, где $p_type => $products. $p_type -- это "Подложка", "Плинтус", "12".
    Но чтобы достать "p_type" из подложки, нужно залезть во внутрь "sds1", что я делаю при помощи функции current, которая возвращает текущий элемент массива current($products) -- Array( [id] => 7 [p_type] => 7)....
    Далее, я обращаюсь к индексу "p_type" массива и получаю 7:
    PHP:
    1.  
    2. <?php
    3. $first = current($products);
    4. echo $first["p_type"];
    5.  
    Самое интересное, что это не вызывает никаких нотисов (ведь в "Плинтус" и "12" нет ключа "p_type"), а просто выдает значения id, т.е 8 и 9!

    Объяснить я могу подобное следующим:
    Когда мы берем current($products) для них, то получаем [id] => 9, значение -- это string/int, а не array. Когда мы обращаемся к string через [], то интерпретатор приводит к int значение в скобках, в результате у нас возвращается $first[0]

    Прав ли я?

    Надо проверить, по идее от двухзначного числа возвращается только первая цифра. Беда еще в том, что isset($first["p_type"]) == true. Вот они, подводные грабли [] для строк.

    P.S. PHP 5.25

    UPD: Мои опасения по поводу первой цифры оправдались. Выход скорее всего будет не через проверку с помощью isset, а через проверку с помощью is_array

    UPD2: Пост может показаться странным. Просто сначала у меня было предположение другое, потом я докопался до истины, во время написания)
     
  2. [vs]

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

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Я в однажды собирал в массив всякую информацию, и в каком-то месте присоеденил к нему строковую переменную:
    PHP:
    1. $array.=$var;
    Потом чуть мозг не сломал, выясняя, почему $array[0] равно "A" :)