LINUX.ORG.RU

Как в PHP отличить обычный и ассоциативный массивы?

 , велосипедисты, ,


0

1

Короче, в функцию передаётся сложный массив с многоуровневыми вложениями. Для вложений определённого уровня нужно так: если это просто массив, перебрать его элементы, если это ассоциативный массив обычных массивов, перебрать их все отдельно. gettype обычные и ассоциативные массивы не различает. А чем они по факту в пыхе отличаются? Я так понял, обычный - это тот же ассоциативный, но без названий ключей (или там вместо ключей порядковые номера?) gettype($key) (число или строка) прокатит?

★☆

Последнее исправление: CYB3R (всего исправлений: 1)

Ответ на: комментарий от stevejobs

Значит,

switch (gettype($key)){
 case 'integer':
  ...
 case 'string':
  ...
}
прокатит?

Вообще, хотелось бы эту проверку до foreach делать, а то так слишком накладно получается. Мешанины ведь точно не будет.

MiniRoboDancer ★☆
() автор топика
Ответ на: комментарий от MiniRoboDancer

Лучше что-нибудь в стиле похапэ

function is_assoc($array) {
  return (bool)count(array_filter(array_keys($array), 'is_string'));
}

(давно спер откуда-то со stackoverflow, погугли)

ну и да, array(1 => 'something') всё сломает, а производительность указанной строчки должна привести в уныние даже самого отчаянного оптимиста

не решай эту проблему, она плохая. В PHP нету «неассоциативных» массивов, ты ищешь то, чего не существует.

stevejobs ★★★★☆
()
Последнее исправление: stevejobs (всего исправлений: 2)
Ответ на: комментарий от stevejobs

ну и да, array(1 => 'something') всё сломает

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

MiniRoboDancer ★☆
() автор топика

Передавай тип массива вторым параметром в функцию, в PHP массивы не различаются.

goingUp ★★★★★
()
Ответ на: комментарий от stevejobs

Хоть, блин, я идиот. Зачем смотреть на ключ, если можно проверить, значение - строка или массив? Так лучше будет, пожалуй.

MiniRoboDancer ★☆
() автор топика
Ответ на: комментарий от cheburashko

Оригинально, но:

$ php -r '$x=["a","b","c"]; unset($x[1]); var_dump($x);'
array(2) {
  [0] =>
  string(1) "a"
  [2] =>
  string(1) "c"
}

KRoN73 ★★★★★
()

gettype($key) (число или строка) прокатит?

нет. В php нет «обычных» массивов, они все ассоциативные. Т.е. в _любой_ массив ты всегда можешь вставить строковый ключ. А проверять ВСЕ ключи...

emulek
()

там массивы реализуют несколько абстракций по-сути в одной сущности. Это плата за универсальность, но по правилу 80/20 данный подход в целом оправдывает себя. Сложность алгоритма - перебор ключей. Признак вида ключей теоретически может быть в движке на C-уровне.

Если не важна производительность - просто перебор и анализ множеств ключей и последующая их классификация, исключая случай пустых множеств. Иначе: можно реализовать классы-обертки моделирующие разные виды массивов: список, кортеж, ассоциативный массив, «смесь», словарь, proplists. В любом случае обходить такие структуры лучше рекурсивно, и здесь легче. Традиционно в таких языках рекурсия не очень эффективна - это не эрланг, но сойдет.

swwwfactory ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.