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 :: Помогите разобраться с foreach

 PHP.SU

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


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

> Описание: Выдает ошибку Invalid argument supplied for foreach()
Thender
Отправлено: 26 Ноября, 2012 - 20:43:24
Post Id


Новичок


Покинул форум
Сообщений всего: 4
Дата рег-ции: Нояб. 2012  


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




проблемма состоит в том что сервер возвращает ошибку :
Invalid argument supplied for foreach()
собственно та часть программы которая ее выдает:
CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2.  
  3. $stringcolor = $Emodel['Gamma'];
  4. //$stringcolor - текстовая строка содержащая индексы цветов разделенные '-'
  5. $colorarray = explode('-',$stringcolor);
  6. // print_r($colorarray); - выводит 3 или 4 значения (проверено)
  7. // echo is_array($colorarray); - выводит 1
  8. function ifcolor($num)
  9.    {
  10.         foreach($colorarray as $Countcolor) //сервер выдает ошибку
  11.               { if ($num==$Countcolor ) {return 'checked';}
  12.                }
  13.    }
  14.  

функция проверяет есть ли цветовой индекс в текстовой строке.
собственно функция вызывается в этом участке:
CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2.  
  3.     $result = mysql_query('SELECT * FROM Colors',$bd);
  4.     $myrow1 = mysql_fetch_array($result);
  5.     $count = 1;
  6.    do
  7.    {
  8.       Echo ifcolor($myrow1['Number']);
  9.     // на самом деле тут выводится чекбокс но скрипт настолько перегружен кавычками что я его заменил простым эхо.
  10.     }
  11.    while ($myrow1 = mysql_fetch_array($result1));
  12.  
  13.  

скрипт должен вывести 2-4 слова 'checked' но выводится ошибка.
мануал по foreach почитал, пусть не полностью, но вкраце осведомлён по принципу работы данной структуры, ошибок в коде не вижу поэтому и обращаюсь за помощью к ГУРУ php.
самое странное для меня - это то что ошибка - "в foreach передается неверный аргумент",
но как написано выше echo is_array($colorarray); - выводит 1. и по всем признакам это массив, да и это не первый скрипт где я использую данную конструкцию.
переменная $Countcolor до foreach - неопределена.
где то закралась ошибка, есть предположение что из-за определения функции, т.к. это первая в моей практике.
 
 Top
sKaa
Отправлено: 26 Ноября, 2012 - 21:04:15
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 979
Дата рег-ции: Окт. 2011  
Откуда: Россия г. Нижний Новгород


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

[+]


Ваш $colorarray находится вне зоны видимости функции, если хотите попробуйте так :


PHP:
скопировать код в буфер обмена
  1. $colorarray = explode('-',$stringcolor);
  2. // print_r($colorarray); - выводит 3 или 4 значения (проверено)
  3. // echo is_array($colorarray); - выводит 1
  4. function ifcolor($num) use (&$colorarray)
  5.    {
  6.         foreach($colorarray as $Countcolor) //сервер выдает ошибку
  7.               { if ($num==$Countcolor ) {return 'checked';}
  8.                }
  9.    }


ну или просто передать как аргумент
 
 Top
Thender
Отправлено: 26 Ноября, 2012 - 22:11:42
Post Id


Новичок


Покинул форум
Сообщений всего: 4
Дата рег-ции: Нояб. 2012  


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




спасибо! действительно если передать как аргумент работает, но ваш вариант с use - намного привлекательнее,
я так понимаю функции не видят глобальных переменных если им их не указать явно?
 
 Top
sKaa
Отправлено: 26 Ноября, 2012 - 22:14:56
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 979
Дата рег-ции: Окт. 2011  
Откуда: Россия г. Нижний Новгород


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

[+]


Thender, верно понимаете. Впрочем есть исключения с global. Но всё это можно найти и прочитать в гугле и без меня.
 
 Top
LIME
Отправлено: 26 Ноября, 2012 - 22:18:59
Post Id


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


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


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




sKaa а зачем амперсанд в use?
(Добавление)
Thender >5.3
 
 Top
sKaa
Отправлено: 26 Ноября, 2012 - 22:21:21
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 979
Дата рег-ции: Окт. 2011  
Откуда: Россия г. Нижний Новгород


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

[+]


LIME, использование переменной по ссылке.
Ну если бы это не было в теле функции массив мог бы поменяться как угодно внутри foreach. Для этого и указал амперсанд. Конечно же он тут роли не играет.

В данном случае будет довольно-таки неплохо работать и так :
function ifcolor($num) use ($colorarray)
 
 Top
LIME
Отправлено: 26 Ноября, 2012 - 22:36:08
Post Id


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


Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010  


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




она итак по ссылке юзается вроде
нет?
 
 Top
Thender
Отправлено: 26 Ноября, 2012 - 22:44:42
Post Id


Новичок


Покинул форум
Сообщений всего: 4
Дата рег-ции: Нояб. 2012  


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




Прошу прощения если в моём посте содержится какая то чушь (поздно уже может просто чего то незамечаю), но сей код :
CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2.         foreach($colorarray as $Countcolor) ;
  3.               {  print_r($colorarray);
  4.                   echo '<br>num='.$num.'<BR>count='.$Countcolor.'<br>';
  5.                   if ($num==$Countcolor ) {return True;break;}
  6.                } return false;
  7.  
  8.  
выводит:
CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. Array ( [0] => 31 [1] => 32 [2] => 38 [3] => )
  3. num=32
  4.  


Если я правильно понимаю Foreach то цикл должен последовательно помещать в переменную $Countcolor значения 31,32,38,'' - последнее в массиве всегда пустое значение, из описания цикла на просторах интернета я вычитал:
"Когда foreach начинает выполняться, внутренний указатель массива переносится на первый элемент. Это означает, что вам не надо вызывать reset() для массива перед началом foreach."
ерунда какая то.
Foreach работает так как будто указатель на последнем элементе и он пустой.
 
 Top
tato
Отправлено: 26 Ноября, 2012 - 23:39:48
Post Id



Посетитель


Покинул форум
Сообщений всего: 468
Дата рег-ции: Сент. 2011  
Откуда: Владивосток


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




return - останавливает выполнение вашей функции, в частности когда срабатывает условие
if ($num==$Countcolor ) {return True;break;} работа данной функции прекращается и форича соответственно тоже.

(Отредактировано автором: 26 Ноября, 2012 - 23:51:19)



-----
просто ?: сложно
 
 Top
Thender
Отправлено: 26 Ноября, 2012 - 23:53:01
Post Id


Новичок


Покинул форум
Сообщений всего: 4
Дата рег-ции: Нояб. 2012  


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




Да Return должен прерывать выполнение foreach как только нашлось ключевое значение - не имеет смысла нагружать сервер дальнейшими поисками значения. но если вы заметили то
условие должно выполняться только дойдя до второго значения, а foreach даже первое не возвращает.
переписал цикл с while и все работает как нужно, теперь выглядит так:
CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. function ifcolorinmodel1($num, &$colorarray)
  3.  
  4.   {   reset($colorarray);
  5.            while (list(, $value) = each($colorarray)) {
  6.                   if ($num==$value ) {unset($value);return 'checked="checked"';}
  7.  
  8.               }  
  9. }
  10.  

а foreach я как ни пробовал, но в этом участке кода, так и не запустил.
CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2.     echo "<input type=\"checkbox\" name=\"name[]\" value=\"" .$myrow1['Number']."\" id=\"" .$myrow1['Number']."\" ".ifcolorinmodel1($myrow1['Number'], $colorarray)."\">";
  3.  

и как и положено чекбокс выводится либо 'checked' либо нет.
sKaa - вам огромное спасибо за помощь с функцией!
правда с use - у меня тоже какую то ошибку вывел, я не стал разбираться и вернул передачу массива параметром функции.

(Отредактировано автором: 26 Ноября, 2012 - 23:54:37)

 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


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



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

 
Powered by ExBB FM 1.0 RC1. InvisionExBB