Покинул форум
Сообщений всего: 111
Дата рег-ции: Окт. 2009 Откуда: Казахстан, Алматы
Помог: 0 раз(а)
Привет, форумчане. Появилась маленькая проблемка в определинии наличия массива, решать ее корявым способом - отключением сообщений об ошибках (собака или настройка) и подобными способами - не профессионально, вроде Хотелось бы использовать чистое решение и правильный код.
Побегал по пхп-сайту - не нашел примеров, но, может, кто сталкивался и знает как определить наличие массива в данный момент? суть такая:
Используя различные условия подгружаю инклюдами различные настройки (массивы), которые нужно проверить на наличие: какой массив в данный момент загружен или отсутствует. Самый простой способ - создать сначала все пустые массивы перед их подгрузкой и проверять пустые они или нет.
Функции isset() и empty() работают только с переменными (не массивами), функция is_array() проверяет только тип загруженной переменной - массив она или нет, пустая функция if ($arr) {} в случае массива (а не переменной) выдает сообщение об ошибке:
Цитата:
Notice: Undefined variable: $arr in /home/xxx/data/www/site.ru/engin e/modules/islemap/blocks.php on line xxx
вариант подсчета массива, типа:
if (count($arr)) {}
и подобные выдают ошибку (при включенных ошибках).
Пробовал различные варианты, но все комбинации функций всё равно выводят ошибку "андефайн". Неужели обязательно нужно сначала создать пустые массивы, загрузить их из кеша и проверить их на "нулл" после загрузки?
Как вариант единственной проверки, которая пришла на ум, - сначала взять первый ключ массива функцией
$key = array_shift($arr);
, если он взят и переменная получена
if (isset($key)) {
echo 'Массив загружен';
} else echo 'Массив не существует';
, то проверяем этот ключ далее на "пустоту" (null). Такой метод кажется весьма громоздким для такой простой задачи Может, есть вариант попроще?
П.С. Для включение ошибок использовал (и без "собак" перед переменными):
error_reporting(E_ALL);
ini_set('display_errors',TRUE);
ini_set('display_startup_errors',TRUE);
set_error_handler('my_error_handler',E_ALL); (Добавление)
О, капец, не догадался, блин. Всё, сделал так:
if (isset($ism) && is_array($ism)) echo 1; else echo 2;
ошибка исчезла
А вот так ранее делал и ошибка была:
if (is_array(isset($ism))) echo 1; else echo 2;
Топик можно закрыть или удалить. (Добавление)
М... странно, все равно ошибки лезут. Эх, вдруг кому из еовичков понадобится Лучший вариант, который смог методом научного тыка найти, вот...
Вариант не прокатывает:
if (!@is_array($arr) && $arr!=null) {}
А вот так всё ок:
if (!@count($arr)) {}
Ну всё, удачи всем, пока.
Uchkuma
Отправлено: 15 Августа, 2010 - 09:27:54
Участник
Покинул форум
Сообщений всего: 1539
Дата рег-ции: Март 2010 Откуда: Киров
Это сработало, а внутри функции выдало ошибку, при чем разные варианты перепробовал - ошибка при всех вариантах, поэтому пока только подсчет массива использую - 0, false, число; если число, то массив загружен, иначе - либо пустой, либо его нет вовсе, что мне и нужно было проверить
Покинул форум
Сообщений всего: 2508
Дата рег-ции: Май 2009 Откуда: Днепропетровск, Украина
Помог: 75 раз(а)
сделайте проверку на иссет на существование первого элемента массива.Или на размер массива, если равен нулю,то ..
isle
Отправлено: 15 Августа, 2010 - 09:59:12
Гость
Покинул форум
Сообщений всего: 111
Дата рег-ции: Окт. 2009 Откуда: Казахстан, Алматы
Помог: 0 раз(а)
SAD пишет:
сделайте проверку на иссет на существование первого элемента массива.Или на размер массива, если равен нулю,то ..
Ну так об этом я и написал - ошибку выдает на иссет, а на калькуляцию с собачкой - работает
Если б знать какой именно элемент массива нужен - другое дело, его можно как переменную иссетом проверить, но когда массивов много и какой у них может быть первый элемент - не известно, то получить первый элемент тоже нельзя (в ассоциативном массиве) - опять ошибка, если элемента нет - уже проверил и не раз. Если нет массива, то и получить первый элемент его нельзя - логично... ну, с собачкой только если... но гораздо проще - это произвести его подсчет, хотя, для больших массивов это, скорее всего, будет накладней.
Uchkuma
Отправлено: 15 Августа, 2010 - 10:21:02
Участник
Покинул форум
Сообщений всего: 1539
Дата рег-ции: Март 2010 Откуда: Киров
Помог: 6 раз(а)
isle пишет:
isset() и empty() работают с переменными, а не массивами, проверил у себя не раз - ошибку выдает, зачем мне вас обманывать?
Не верю. Текст ошибки в студию! И код строки, в которой происходит ошибка.
isle
Отправлено: 15 Августа, 2010 - 11:25:40
Гость
Покинул форум
Сообщений всего: 111
Дата рег-ции: Окт. 2009 Откуда: Казахстан, Алматы
Помог: 0 раз(а)
Uchkuma пишет:
Не верю. Текст ошибки в студию! И код строки, в которой происходит ошибка.
Цитату в первом сообщении можете глянуть
Проверку как делал - тоже написал, раз лень смотреть сначала, процитирую еще раз:
Цитата:
Notice: Undefined variable: $arr in /home/xxx/data/www/site.ru/engin e/modules/islemap/blocks.php on line xxx
Проверку делал разными вариантами, например, так (тоже выше привел несколько примеров, вываливающих мне ошибки):
что просто иссет оставить, что просто из_аррай - всё равно ошибку "андефайн" выкидывает, типа, элемент такой не найден Как поставить или снять ошибки - тоже написал, если у вас нет ошибок на экране - это значит, что они выключены, а не то, что ваш код идеален, включите и гляньте, убедитесь сами ;)
Uchkuma
Отправлено: 15 Августа, 2010 - 11:46:17
Участник
Покинул форум
Сообщений всего: 1539
Дата рег-ции: Март 2010 Откуда: Киров
Помог: 6 раз(а)
isle, с выводом ошибок у меня все нормально. Просто задумайтесь: как функция, которая предназначена для проверки установлена переменная или нет, может генерировать ошибку при неустановленной переменной??? Не важно, переменная это должна быть или массив - она не установлена!
isle пишет:
Notice: Undefined variable: $arr in /home/xxx/data/www/site.ru/engin e/modules/islemap/blocks.php on line xxx
Скопируйте мне строку "xxx". (Добавление) isset().
Цитата:
Описание
bool isset (mixed var [, mixed var [, ...]])
mixed var - это значит, что переменная может быть и строкой и массивом.
isle
Отправлено: 15 Августа, 2010 - 12:06:21
Гость
Покинул форум
Сообщений всего: 111
Дата рег-ции: Окт. 2009 Откуда: Казахстан, Алматы
Помог: 0 раз(а)
Uchkuma, только что понял... ох, капец, какой я косячник
Сейчас поставил проверку без инклюда, чтоб еще раз убедиться в вашей настойчивости... М... сколько не живи, а всё равно всех истин не познаешь... Скорее всего дело вот в чем: наклепал огромнейшую функцию и вначале определил список глобальных переменных, видимо, ошибка потому и выскакивала, что некоторые переменные уже были глобальными, а я их инклюдил еще и как локальные (массивы-настройки), только что заметил это в своей "портянке", а мне казалось, что ошибка именно на проверку (иссет и из_аррай), а не на инклюд вылетала, таких ошибок около сотни.
П.С. строку уже много раз копировал, вот весь код строки (менял много раз с разными комбинациями):
if (!isset($arr) && !is_array($arr)) @include $file;
Сейчас закомментировал инклюд - ошибка исчезла на иссет, но еще помусолю, чтоб убедиться самому наверняка.
Спасибо огромное, всё-таки докопались до истины, а я уже забить хотел... Ну, уже везде каунты прописал с собачкой вместо иссета, эх, обратно править буду. Еще раз спасибо.
(Добавление)
Мне на практике пришлось использовать собаку только в одном случае - в функции, отдающей файл браузеру, чтобы в случае ошибок не портить бинарник. А если ошибки сохраняются в файл, а не выводятся в браузер, то я вообще не вижу смысла использовать @. Правильный код должен работать без ошибок!
JustUserR
Отправлено: 16 Августа, 2010 - 00:22:21
Активный участник
Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009
Помог: 17 раз(а)
isle Условие при которых требуется одновременно проверить наличие некоторого объекта и его свойства встречаются достаточно часто - например если при разборе HTML-документа с помощью DOM-модели требуется найти необходимых тег который обладает заданным значением некоторого аттрибута - то необходимо сначала проверить наличие очередного выбранного элемена и потом требуемого свойства в нем и только потом уже само значение свойства
При прямом составлении логического условия для указанной задачи требуется несколько вложенных if-операторов с последовательной проверкой - но на самом деле для этой цели используются операцию короткого замакания Суть заключается в создании набора условий который соединены между собой укороченным оператором И - при его вычислении последовательно проверятся истинность каждого из оперантов - и в случае определения ложных значений дальшейнее вычислени не просходит Это дает возможность записать требумые проверочные парамеры в том порядке - что те возможность работы с которым следуют из некоторых других должны идти в последующей позиции
----- Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.