Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Загружен ли массив?

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Описание: Определение наличия массива в памяти
isle
Отправлено: 15 Августа, 2010 - 06:58:33
Post Id



Гость


Покинул форум
Сообщений всего: 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)) {}

Ну всё, удачи всем, пока.
 
 Top
Uchkuma
Отправлено: 15 Августа, 2010 - 09:27:54
Post Id



Участник


Покинул форум
Сообщений всего: 1539
Дата рег-ции: Март 2010  
Откуда: Киров


Помог: 6 раз(а)




Нагородили огород.
PHP:
скопировать код в буфер обмена
  1. if(isset($arr) && is_array($arr)) echo 'Массив есть'; else echo 'Массива нет';
Это не должно выдавать ошибок.
(Добавление)
isle пишет:
if (is_array(isset($ism))) echo 1; else echo 2;
Шедеврально! isset($ism) вернет правду или ложь, а вы проверяете является ли правда или ложь массивом.
 
 Top
isle
Отправлено: 15 Августа, 2010 - 09:35:50
Post Id



Гость


Покинул форум
Сообщений всего: 111
Дата рег-ции: Окт. 2009  
Откуда: Казахстан, Алматы


Помог: 0 раз(а)




isset() и empty() работают с переменными, а не массивами, проверил у себя не раз - ошибку выдает, зачем мне вас обманывать? Ха-ха

Единственный вариант проверки наличия массива нашел для себя - это его подсчет с отключением ошибки "собачкой".

Уточню на всякий случай.

В глобальной видимости

CODE (htmlphp):
скопировать код в буфер обмена
  1. if(isset($arr) && is_array($arr)) echo 'Массив есть'; else echo 'Массива нет';


Это сработало, а внутри функции выдало ошибку, при чем разные варианты перепробовал - ошибка при всех вариантах, поэтому пока только подсчет массива использую - 0, false, число; если число, то массив загружен, иначе - либо пустой, либо его нет вовсе, что мне и нужно было проверить Улыбка

(Отредактировано автором: 15 Августа, 2010 - 09:40:29)

 
 Top
SAD
Отправлено: 15 Августа, 2010 - 09:51:00
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2508
Дата рег-ции: Май 2009  
Откуда: Днепропетровск, Украина


Помог: 75 раз(а)




сделайте проверку на иссет на существование первого элемента массива.Или на размер массива, если равен нулю,то ..
 
 Top
isle
Отправлено: 15 Августа, 2010 - 09:59:12
Post Id



Гость


Покинул форум
Сообщений всего: 111
Дата рег-ции: Окт. 2009  
Откуда: Казахстан, Алматы


Помог: 0 раз(а)




SAD пишет:
сделайте проверку на иссет на существование первого элемента массива.Или на размер массива, если равен нулю,то ..


Ну так об этом я и написал - ошибку выдает на иссет, а на калькуляцию с собачкой - работает Улыбка

Если б знать какой именно элемент массива нужен - другое дело, его можно как переменную иссетом проверить, но когда массивов много и какой у них может быть первый элемент - не известно, то получить первый элемент тоже нельзя (в ассоциативном массиве) - опять ошибка, если элемента нет - уже проверил и не раз. Если нет массива, то и получить первый элемент его нельзя - логично... ну, с собачкой только если... но гораздо проще - это произвести его подсчет, хотя, для больших массивов это, скорее всего, будет накладней.
 
 Top
Uchkuma
Отправлено: 15 Августа, 2010 - 10:21:02
Post Id



Участник


Покинул форум
Сообщений всего: 1539
Дата рег-ции: Март 2010  
Откуда: Киров


Помог: 6 раз(а)




isle пишет:
isset() и empty() работают с переменными, а не массивами, проверил у себя не раз - ошибку выдает, зачем мне вас обманывать?
Не верю. Текст ошибки в студию! И код строки, в которой происходит ошибка.
 
 Top
isle
Отправлено: 15 Августа, 2010 - 11:25:40
Post Id



Гость


Покинул форум
Сообщений всего: 111
Дата рег-ции: Окт. 2009  
Откуда: Казахстан, Алматы


Помог: 0 раз(а)




Uchkuma пишет:
Не верю. Текст ошибки в студию! И код строки, в которой происходит ошибка.


Цитату в первом сообщении можете глянуть Улыбка

Проверку как делал - тоже написал, раз лень смотреть сначала, процитирую еще раз:

Цитата:
Notice: Undefined variable: $arr in /home/xxx/data/www/site.ru/engin e/modules/islemap/blocks.php on line xxx


Проверку делал разными вариантами, например, так (тоже выше привел несколько примеров, вываливающих мне ошибки):

CODE (htmlphp):
скопировать код в буфер обмена
  1. if (isset($arr) && is_array($arr)) {
  2.  ...
  3. }


что просто иссет оставить, что просто из_аррай - всё равно ошибку "андефайн" выкидывает, типа, элемент такой не найден Улыбка Как поставить или снять ошибки - тоже написал, если у вас нет ошибок на экране - это значит, что они выключены, а не то, что ваш код идеален, включите и гляньте, убедитесь сами ;)
 
 Top
Uchkuma
Отправлено: 15 Августа, 2010 - 11:46:17
Post Id



Участник


Покинул форум
Сообщений всего: 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 - это значит, что переменная может быть и строкой и массивом.
 
 Top
isle
Отправлено: 15 Августа, 2010 - 12:06:21
Post Id



Гость


Покинул форум
Сообщений всего: 111
Дата рег-ции: Окт. 2009  
Откуда: Казахстан, Алматы


Помог: 0 раз(а)




Uchkuma, только что понял... ох, капец, какой я косячник Ха-ха

Сейчас поставил проверку без инклюда, чтоб еще раз убедиться в вашей настойчивости... М... сколько не живи, а всё равно всех истин не познаешь... Радость Скорее всего дело вот в чем: наклепал огромнейшую функцию и вначале определил список глобальных переменных, видимо, ошибка потому и выскакивала, что некоторые переменные уже были глобальными, а я их инклюдил еще и как локальные (массивы-настройки), только что заметил это в своей "портянке", а мне казалось, что ошибка именно на проверку (иссет и из_аррай), а не на инклюд вылетала, таких ошибок около сотни.

П.С. строку уже много раз копировал, вот весь код строки (менял много раз с разными комбинациями):

CODE (htmlphp):
скопировать код в буфер обмена
  1. if (!isset($arr) && !is_array($arr)) @include $file;


Сейчас закомментировал инклюд - ошибка исчезла на иссет, но еще помусолю, чтоб убедиться самому наверняка.

Спасибо огромное, всё-таки докопались до истины, а я уже забить хотел... Ну, уже везде каунты прописал с собачкой вместо иссета, эх, обратно править буду. Еще раз спасибо.

(Отредактировано автором: 15 Августа, 2010 - 12:07:00)

 
 Top
Uchkuma
Отправлено: 15 Августа, 2010 - 12:14:51
Post Id



Участник


Покинул форум
Сообщений всего: 1539
Дата рег-ции: Март 2010  
Откуда: Киров


Помог: 6 раз(а)




Пожалуйста!
isle пишет:
if (isset($arr) && is_array($arr)) @include $file;
Потому и просил скопировать мне всю строку как есть. До этого я @include $file; не видел. И лучше собаку понапрасну не используйте.
Пишите так:

(Добавление)
Мне на практике пришлось использовать собаку только в одном случае - в функции, отдающей файл браузеру, чтобы в случае ошибок не портить бинарник. А если ошибки сохраняются в файл, а не выводятся в браузер, то я вообще не вижу смысла использовать @. Правильный код должен работать без ошибок!
 
 Top
JustUserR
Отправлено: 16 Августа, 2010 - 00:22:21
Post Id



Активный участник


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


Помог: 17 раз(а)




isle Условие при которых требуется одновременно проверить наличие некоторого объекта и его свойства встречаются достаточно часто - например если при разборе HTML-документа с помощью DOM-модели требуется найти необходимых тег который обладает заданным значением некоторого аттрибута - то необходимо сначала проверить наличие очередного выбранного элемена и потом требуемого свойства в нем и только потом уже само значение свойства
При прямом составлении логического условия для указанной задачи требуется несколько вложенных if-операторов с последовательной проверкой - но на самом деле для этой цели используются операцию короткого замакания Суть заключается в создании набора условий который соединены между собой укороченным оператором И - при его вычислении последовательно проверятся истинность каждого из оперантов - и в случае определения ложных значений дальшейнее вычислени не просходит Это дает возможность записать требумые проверочные парамеры в том порядке - что те возможность работы с которым следуют из некоторых других должны идти в последующей позиции


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Программирование на PHP »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB