1. PHP / Говнокод #11386

    +48

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    function is_array_assoc($arr) {
        if (is_array($arr)) {
            foreach ($arr as $k => $v) {
                if (is_string($k) || (is_int($k) && $k < 0)) {
                    return 1;
                }
            }
            return 0;
        }
        return -1;
    }

    Взята с php.net проверка массива на ассоциативность.
    Типа array(5 => 4, 8=>9, 1 => 3) не ассоциативный?

    Запостил: mkusher, 09 Июля 2012

    Комментарии (13) RSS

    • Да само понятие "ассоциативный массив" в PHP условно. Тут не в решении проблема, а в постановке задачи.
      Ответить
      • я думаю на 0 ожидается индексный, а на 1 - все остальное.
        Ответить
        • Возвращаемые значения понятны.

          Непонятно лишь, что именно считать "индексным массивом". И, главное, зачем?
          Ответить
    • А в чем смысл такой проверки? Собираются применить какую-то супер-мега-кулхацкерскую оптимизацию для случая с неотрицательными целочисленными ключами?
      Ответить
      • Иногда в инфраструктуре полезно сделать такую проверку чтобы определить нужно ли сохранять ключи или они не имеют значения. Иногда ещё параметры так определяют, в зависимости от ассоциативности массива они трактуются по-разному... Но вообще то, что написано у автора делается в одну строку:
        return array_values($arr) === $arr;
        и мне на практике пригодилось лишь один раз. Да и то скорей всего потому что я ещё неправильно структуру строил в школьном-то возрасте. :)

        ...Ну почти то же самое. Совсем то же было бы через !ctype_digit(implode('', array_keys($arr));
        Ответить
    • А там, случаем, потом не велосипедируется свой json_encode()? :)
      Там же как раз похожая проверка должна делаться.
      Ответить
    • в пхп, как я говорил, есть жуткая неприятность: он пытается ключи привести к числу (даже если это строки), и если у него получается, то он упорно считает, что к массиву обращаются по индексу. у меня лично переубедить его когда-то не удалось.
      поэтому для сохранения ассоциативности лучше использовать буквенные ключи, а если нужны таки числа, то маскировать их от пхп, скажем, подчеркиваниями.
      Ответить
      • Ну это на самом деле последствия нестрогой типизации. Не было бы приведения - приходилось бы везде писать $array[(int)$id] или $array[(string)$key].
        Бывает когда из базы выборку делаешь, раскладываешь всё в массив по $items[$row->id] = $row; - а там поди потом разбери как обратиться из другого места - строковый ключ или числовой. :)
        Ответить
        • PHP вообще очень любит приводить строки к числам, если ему кажется, что строка очень похожа на число. Даже если его об этом никто не просит. Натура такая, ничего не поделать.
          Ответить
          • Оптимизация бля.
            Ответить
            • Да нет, скорее защита от дурака, который не понимает разницы между "4" и 4.
              Ответить
              • и люди пишут на языке, который считает их дебилами, не отличающими строки от числа?
                Ответить
                • И самое печальное - из-за такого языка людей не отличающих строки от числа становится больше...
                  Ответить

    Добавить комментарий