За последние 24 часа нас посетили 22647 программистов и 1280 роботов. Сейчас ищут 806 программистов ...

Как програмно различать массивы и хеши?

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

  1. AterCattus

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

    С нами с:
    6 фев 2008
    Сообщения:
    80
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    Подкиньте идею по поводу subj. Как различить $a и $b?
    PHP:
    1. <?php $a = array( '0', 1, '2', 3 ); $b = array( '0' => 2, '1' => 3 ); ?>
    Мне нужно по разному обрабатывать данные массивы в зависимости от формата.

    Пробовал array_keys, двойной array_flip... Не знаю уж как еще, ничего в голову не приходит. :(

    Заранее спасибо!
     
  2. Anonymous

    Anonymous Guest

    А какой именно признак ты хочешь определить?
     
  3. Dagdamor

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

    С нами с:
    4 фев 2006
    Сообщения:
    2.095
    Симпатии:
    1
    Адрес:
    Барнаул
    AterCattus
    Четкой границы в PHP нет. В твоем примере, например, оба массива - "массивы". Я делаю примерно так:
    echo array_keys($array)===array_keys(array_keys($array))?"Массив":"Хеш";
     
  4. AterCattus

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

    С нами с:
    6 фев 2008
    Сообщения:
    80
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    Горбунов Олег
    Нужно знать, был описан просто набор значений или именно хеш. Я специально привел такой пример, что array_keys() выдает в обоих случаях одинаковый результат ( и типы и значения ).

    Dagdamor
    Я понимаю, что четко они не разделяются, а проблема стоит.

    Можно конечно проверить, что все ключи числовые и даны от 0 и до количества-1. Это вариант, но медленный он какой-то.
    А хороший вариант, чувствует разницу между array( '0', 1, '2', 3 ) и array( '0' => 2, '3' => 1). Вот только === тут, имхо, излишне:
    и с обоих сторон равенства всегда массивы при корректных входных данных.
     
  5. Dagdamor

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

    С нами с:
    4 фев 2006
    Сообщения:
    2.095
    Симпатии:
    1
    Адрес:
    Барнаул
    AterCattus
    Я бы не поставил ===, если бы было достаточно ==. Нужно же еще порядок следования ключей проверять.
    Ре: проблема стоит - смотри:
    PHP:
    1. <?php
    2.  
    3. $array1=array(100, 200, 300);
    4. $array2=array(0=>100, 1=>200, 2=>300);
    Эти два массива во внутреннем представлении в PHP абсолютно идентичны, нет способа их различить. Ну так он работает, что поделать.
     
  6. AterCattus

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

    С нами с:
    6 фев 2008
    Сообщения:
    80
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    Такой вариант в моем случае рассматривается как массив. Я специально написал,
    Это условие для предложенных массива и хеша выполняется.

    Ну в общем я разобрался, спасибо. Тема закрыта.