Цивилизованный способ проверить сущесвтование элемента массива

imi

Guest
Цивилизованный способ проверить сущесвтование элемента массива

Есть многомерный массив.
PHP:
$arr['c1']['c2']['c3']['c4']['c5']['c6']['c7']['c8']=='string value';
Размерность его нефиксирована. т.е. может быть ситуация
PHP:
$arr['c1']['c2']['c3']=='another string value';
Теперь нужно проверить существование определенного элемента массива. В PHP4 я делал простое условие и оно работало:
PHP:
if (isset($arr['c1']['c2']['c3']['c4']['c5']['c6']['c7']['c8'])) 
{ 
.... 
}
но PHP5 выдает ошибку "Fatal error: Cannot use string offset as an array...."
В какой-то степени оно, конечно, логично но как тогда проверять?
Можно делать монстряческие конструкции вроде
PHP:
if (is_array($arr['c1']) && is_array ($arr['c1']['c2']) && .... 
     ...&& isset($arr['c1']['c2']['c3']['c4']['c5']['c6']['c7']['c8'])) 
{ 
.... 
}
но такой код просто ужасен в смысле читабельности...
Можно ли как-то по другому это делать? :confused:

Пример скрипта, выдающего ошибку:
PHP:
$arr['c1']='aaa'; 
echo isset($arr['c1']['c2']['c3']['c4']);
 

yugene

Отошел от дел
Автор оригинала: imi
Пример скрипта, выдающего ошибку:
PHP:
$arr['c1']='aaa'; 
echo isset($arr['c1']['c2']['c3']['c4']);
В данном случае переменная $arr['c1'] не является массивом:

PHP:
$arr['c1']='aaa';
Это просто строка, поэтому при обращении к ней, как к массиву,

PHP:
$arr['c1']['c2']['c3']['c4'];
и выдается ошибка.

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

Popoff

popoff.donetsk.ua
посмотри [m]in_array[/m], там в комментариях пользователей есть нужная тебе функция.
 

imi

Guest
Popoff
Спасибо, это я, естественно, смотрел. В точности той функции, которая мне нужна, там нет, но написать такую функцию - не проблема. Но мне кажется, что должен быть более простой и быстрый способ. Вот только какой?
Тем более, что:
1. в PHP4 это работает
2. если в приведенном примере (выдающем ошибку) убрать ['c4'], то он и в PHP5 заработает!...
yugene
на вход даются результаты парсинга файла, похожего на xml. Их надо дополнительно обрабатывать. И массивы там не восьмимерные :)

-~{}~ 06.04.05 17:21:

yugene
к тому же как видно из примера, проблема возникает даже в 4-х мерном массиве, а уж 4-х мерный массив можно применить много где...
 

DimbIch

Новичок
empty()
если по условия подойдет...
isset - выдает ошибку...
empty - нет и нормально работает - если опять же тебе подойдет по условию это
 

imi

Guest
DimbIch
у меня PHP 5.0.4 и с empty() выдается та же самая ошибка.
 

Panchous

Павел
imi
тебе уже ответили, в чем твоя ошибка (см. пост yugene)
какие еще вопросы остались?
 

Popoff

popoff.donetsk.ua
Автор оригинала: imi
Спасибо, это я, естественно, смотрел. В точности той функции, которая мне нужна, там нет
Там есть функция, которая решает в точности ту задачу, которую ты поставил в своем первом посте.
Тем более, что:
1. в PHP4 это работает
Это не тем более. Это отмазка для того, что бы делать именно так, как делаешь ты, а не как-нибудь по другому.

-~{}~ 06.04.05 19:26:

Даже не так: это отмазка для того, что бы оставить все как есть и не мучить себя размышлениями о том, как это должно быть :)
 

imi

Guest
Panchous
Popoff
Еще раз, этот код НЕ генерирует ошибки :
PHP:
$arr['c1']='aaa'; 
echo isset($arr['c1']['c2']['c3']);
Даже E_NOTICE не генерируется!
Что это может означать? Это может означать, что подобная проверка ПРЕДУСМОТРЕНА в PHP. И в PHP4, и в PHP5. Так что не надо говорить мне, что нужно внимательнее смотреть пост yugene... И про отмазки - не совсем в тему.
У меня есть массив хрен знает какой размерности, в каждом измерении может быть до тысячи ключей... не во всех конечно (ибо в 2 отведенных мегабайта он вмещается), и на этом массиве мне нужно сделать около 10 тысяч таких проверок.
Именно поэтому я считаю функцию, которая бы бегала по всем ключам и проверяла их наличие НЕЦИВИЛИЗОВАННЫМ методом. Уж скорее я буду использовать монстряческие конструкции вроде описанных в моем первом посте...

И снова обращение к знатокам и практикам PHP
Подскажите ЦИВИЛИЗОВАННЫЙ и БЫСТРЫЙ способ проверки существования элемента многомерного массива! Или других способов не существует?
 

Кром

Новичок
imi
Дело в том, что сам подход к проблеме у тебя ошибочный. Ты неправильно формируешь массив перемешав в нем все в одну кучу, а потом обращаешся к несуществующим элементам(!) и удивляешся ошибкам.
Способ тебе нужен? Он есть - isset().
Если он тебя не устраивает, передаелай массив таким образом, что бы его размерность была всегда одинакова.
 
Сверху