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
Форумы портала PHP.SU :: Версия для печати :: Помогите разобраться с foreach
Форумы портала PHP.SU » » Вопросы новичков » Помогите разобраться с foreach

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

1. Thender - 26 Ноября, 2012 - 20:43:24 - перейти к сообщению
проблемма состоит в том что сервер возвращает ошибку :
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 - неопределена.
где то закралась ошибка, есть предположение что из-за определения функции, т.к. это первая в моей практике.
2. sKaa - 26 Ноября, 2012 - 21:04:15 - перейти к сообщению
Ваш $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.    }


ну или просто передать как аргумент
3. Thender - 26 Ноября, 2012 - 22:11:42 - перейти к сообщению
спасибо! действительно если передать как аргумент работает, но ваш вариант с use - намного привлекательнее,
я так понимаю функции не видят глобальных переменных если им их не указать явно?
4. sKaa - 26 Ноября, 2012 - 22:14:56 - перейти к сообщению
Thender, верно понимаете. Впрочем есть исключения с global. Но всё это можно найти и прочитать в гугле и без меня.
5. LIME - 26 Ноября, 2012 - 22:18:59 - перейти к сообщению
sKaa а зачем амперсанд в use?
(Добавление)
Thender >5.3
6. sKaa - 26 Ноября, 2012 - 22:21:21 - перейти к сообщению
LIME, использование переменной по ссылке.
Ну если бы это не было в теле функции массив мог бы поменяться как угодно внутри foreach. Для этого и указал амперсанд. Конечно же он тут роли не играет.

В данном случае будет довольно-таки неплохо работать и так :
function ifcolor($num) use ($colorarray)
7. LIME - 26 Ноября, 2012 - 22:36:08 - перейти к сообщению
она итак по ссылке юзается вроде
нет?
8. Thender - 26 Ноября, 2012 - 22:44:42 - перейти к сообщению
Прошу прощения если в моём посте содержится какая то чушь (поздно уже может просто чего то незамечаю), но сей код :
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 работает так как будто указатель на последнем элементе и он пустой.
9. tato - 26 Ноября, 2012 - 23:39:48 - перейти к сообщению
return - останавливает выполнение вашей функции, в частности когда срабатывает условие
if ($num==$Countcolor ) {return True;break;} работа данной функции прекращается и форича соответственно тоже.
10. Thender - 26 Ноября, 2012 - 23:53:01 - перейти к сообщению
Да 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 - у меня тоже какую то ошибку вывел, я не стал разбираться и вернул передачу массива параметром функции.

 

Powered by ExBB FM 1.0 RC1