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]   

> Без описания
Extazy
Отправлено: 02 Июня, 2012 - 16:28:34
Post Id


Посетитель


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


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




Здравствуйте.
Вначале у меня был написан такой код:
PHP:
скопировать код в буфер обмена
  1. $i = 0;
  2.     while ($row = mysql_fetch_assoc($result)) {
  3.         $rating[$i] = $row['rating'];
  4.         $votes[$i] = $row['votes'];
  5.         $mark[$i] = round($rating[$i]/$votes[$i]);
  6.         $i++;
  7. }

$row['rating'] и $row['votes'] это массив чисел, который берёт из базы данных.
Код выше выдавал ошибку на строке $mark[$i] = round($rating[$i]/$votes[$i]);:
CODE (htmlphp):
скопировать код в буфер обмена
  1. Cannot use a scalar value as an array

Поискав в интернете, я узнал, что данная ошибка возникает когда переменной сначала было присвоено скалярное значение (число, строка), а потом к ней обратились как к массиву. Пример: $a = 1; $a[] = 1; Нужно сначала явно присвоить переменной массив: $a = array().

Тогда я переписал код следующим образом:
PHP:
скопировать код в буфер обмена
  1. $rating = array();
  2.     $votes = array();
  3.     $mark = array();
  4.  
  5.     $i = 0;
  6.     while ($row = mysql_fetch_assoc($result)) {
  7.         $rating[$i] = $row['rating'];
  8.         $votes[$i] = $row['votes'];
  9.         $mark[$i] = round($rating[$i]/$votes[$i]);
  10.         $i++;
  11. }


Прежняя ошибка пропала и теперь появилась новая:
PHP:
скопировать код в буфер обмена
  1. Warning: math: parameter a: is not numeric in Z:\home\test1.ru\www\libs\plugins\function.math.php on line 63


Подскажите что это за ошибка и как её убрать? Растерялся

(Отредактировано автором: 02 Июня, 2012 - 16:30:00)

 
 Top
DelphinPRO
Отправлено: 02 Июня, 2012 - 16:31:06
Post Id



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


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


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




---del---

(Отредактировано автором: 02 Июня, 2012 - 16:31:54)



-----
Чем больше узнаю, тем больше я не знаю.
 
 Top
Extazy
Отправлено: 02 Июня, 2012 - 16:32:01
Post Id


Посетитель


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


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




63 строка того файла:
PHP:
скопировать код в буфер обмена
  1.             if (!is_numeric($val)) {
  2.                 trigger_error("math: parameter $key: is not numeric",E_USER_WARNING);
  3.                 return;
 
 Top
DelphinPRO
Отправлено: 02 Июня, 2012 - 16:33:12
Post Id



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


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


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




собственно вам говорят что переменная $val не является числовым значением.
почему?
смотрите по коду выше


-----
Чем больше узнаю, тем больше я не знаю.
 
 Top
Extazy
Отправлено: 02 Июня, 2012 - 16:40:02
Post Id


Посетитель


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


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




а какая из них относится к $val ? ....

Мои переменные содержат следующие значения:
print_r ($rating):
PHP:
скопировать код в буфер обмена
  1. Array ( [0] => 63 [1] => 37 [2] => 37 [3] => 51 [4] => 63 )

print_r ($votes):
PHP:
скопировать код в буфер обмена
  1. Array ( [0] => 11 [1] => 5 [2] => 5 [3] => 7 [4] => 11 )


тут ведь все цифры.. почему они как строки воспринимаются?
(Добавление)
PHP:
скопировать код в буфер обмена
  1. print gettype ($rating[$i]);
  2. print gettype ($votes[$i]);

- показывает что это всё строки / string.. но почему?? Огорчение
В базе эти данные берутся из поля INT.
(Добавление)
!!!
я преобразовал строки в числа и всё заработало..
PHP:
скопировать код в буфер обмена
  1. $rating[$i] = intval($row['rating']);
  2. $votes[$i] = intval($row['votes']);


однако ошибка какаято непонятная все еще осталась:
CODE (htmlphp):
скопировать код в буфер обмена
  1. Warning: math: parameter a: is not numeric in Z:\home\test1.ru\www\libs\plugins\function.math.php on line 63

(Добавление)
Вот кусок кода где содержится 63 строка
PHP:
скопировать код в буфер обмена
  1. function smarty_function_math($params, $template)
  2. {
  3.     static $_allowed_funcs = array(
  4.         'int' => true, 'abs' => true, 'ceil' => true, 'cos' => true, 'exp' => true, 'floor' => true,
  5.         'log' => true, 'log10' => true, 'max' => true, 'min' => true, 'pi' => true, 'pow' => true,
  6.         'rand' => true, 'round' => true, 'sin' => true, 'sqrt' => true, 'srand' => true ,'tan' => true
  7.     );
  8.     // be sure equation parameter is present
  9.     if (empty($params['equation'])) {
  10.         trigger_error("math: missing equation parameter",E_USER_WARNING);
  11.         return;
  12.     }
  13.  
  14.     $equation = $params['equation'];
  15.  
  16.     // make sure parenthesis are balanced
  17.     if (substr_count($equation,"(") != substr_count($equation,")")) {
  18.         trigger_error("math: unbalanced parenthesis",E_USER_WARNING);
  19.         return;
  20.     }
  21.  
  22.     // match all vars in equation, make sure all are passed
  23.     preg_match_all("!(?:0x[a-fA-F0-9]+)|([a-zA-Z][a-zA-Z0-9_]*)!",$equation, $match);
  24.  
  25.     foreach($match[1] as $curr_var) {
  26.         if ($curr_var && !isset($params[$curr_var]) && !isset($_allowed_funcs[$curr_var])) {
  27.             trigger_error("math: function call $curr_var not allowed",E_USER_WARNING);
  28.             return;
  29.         }
  30.     }
  31.  
  32.     foreach($params as $key => $val) {
  33.         if ($key != "equation" && $key != "format" && $key != "assign") {
  34.             // make sure value is not empty
  35.             if (strlen($val)==0) {
  36.                 trigger_error("math: parameter $key is empty",E_USER_WARNING);
  37.                 return;
  38.             }
  39.             if (!is_numeric($val)) {
  40.                 trigger_error("math: parameter $key: is not numeric",E_USER_WARNING);
  41.                 return;
  42.             }
  43.             $equation = preg_replace("/\b$key\b/", " \$params['$key'] ", $equation);
  44.         }
  45.     }

(Добавление)
слишком сложный код видимо .(( снова я попал в тупик +((

(Отредактировано автором: 02 Июня, 2012 - 16:45:28)

 
 Top
Bio man
Отправлено: 02 Июня, 2012 - 18:40:11
Post Id


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


Покинул форум
Сообщений всего: 2751
Дата рег-ции: Июль 2010  
Откуда: Даугавпилс, Латвия


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




Extazy пишет:
В базе эти данные берутся из поля INT.
ВСЁ, что приходит с БД будет строкой!
Перед
PHP:
скопировать код в буфер обмена
  1. foreach($params as $key => $val) {
вставь это
PHP:
скопировать код в буфер обмена
  1. array_walk($params, function(&$val, $key){$val = (int)$val;});

Впервые вижу, что бы так проверяли на пустоту!
PHP:
скопировать код в буфер обмена
  1. // make sure value is not empty
  2.             if (strlen($val)==0) {

(Добавление)
Extazy пишет:
слишком сложный код видимо
Код не сложный, просто он плохой, как в народе говорят - говнокод.

(Отредактировано автором: 02 Июня, 2012 - 18:42:59)

 
 Top
Extazy
Отправлено: 02 Июня, 2012 - 19:40:18
Post Id


Посетитель


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


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




Bio man пишет:
array_walk($params, function(&$val, $key){$val = (int)$val;});

в этой строке выдало ошибку:
CODE (htmlphp):
скопировать код в буфер обмена
  1. Parse error: syntax error, unexpected T_FUNCTION in Z:\home\test1.ru\www\libs\plugins\function.math.php on line 54


Цитата:
Впервые вижу, что бы так проверяли на пустоту!

это не мой код, а код шаблонизатора Smarty http://www[dot]smarty[dot]net/ - может и его нубы писали))
 
 Top
Bio man
Отправлено: 02 Июня, 2012 - 19:43:38
Post Id


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


Покинул форум
Сообщений всего: 2751
Дата рег-ции: Июль 2010  
Откуда: Даугавпилс, Латвия


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




Extazy
какая версия РНР?
 
 Top
Extazy
Отправлено: 02 Июня, 2012 - 19:46:09
Post Id


Посетитель


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


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




PHP Version 5.2.12, сайт тестирую на денвере.

(Отредактировано автором: 02 Июня, 2012 - 19:46:39)

 
 Top
Bio man
Отправлено: 02 Июня, 2012 - 20:03:17
Post Id


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


Покинул форум
Сообщений всего: 2751
Дата рег-ции: Июль 2010  
Откуда: Даугавпилс, Латвия


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




PHP:
скопировать код в буфер обмена
  1. array_walk($params, 'strToInt');
  2. function strToInt(&$val, $key){
  3.   $val = (int)$val;
  4. }
 
 Top
Extazy
Отправлено: 02 Июня, 2012 - 20:07:40
Post Id


Посетитель


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


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




новые ошибки:
PHP:
скопировать код в буфер обмена
  1. [function.array-walk]: Unable to call
  2. strToInt() - function does not exist in Z:\home\test1.ru\www\libs\plugins\function.math.php on line 54
  3.  
  4. Warning: math: parameter a: is not numeric in Z:\home\test1.ru\www\libs\plugins\function.math.php on line 69

Огорчение Огорчение
 
 Top
Bio man
Отправлено: 02 Июня, 2012 - 20:12:11
Post Id


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


Покинул форум
Сообщений всего: 2751
Дата рег-ции: Июль 2010  
Откуда: Даугавпилс, Латвия


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




Просмотрел момент. Вставь это
PHP:
скопировать код в буфер обмена
  1. function strToInt(&$val, $key){
  2.   $val = (int)$val;
  3. }

до
PHP:
скопировать код в буфер обмена
  1. function smarty_function_math($params, $template)
 
 Top
Extazy
Отправлено: 02 Июня, 2012 - 20:21:38
Post Id


Посетитель


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


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




снова ошибка:

PHP:
скопировать код в буфер обмена
  1. Fatal error: Cannot redeclare strtoint() (previously declared

(Добавление)
это
PHP:
скопировать код в буфер обмена
  1. function strToInt(&$val, $key){
  2.  
  3.   $val = (int)$val;
  4.  
  5. }


вставил до
PHP:
скопировать код в буфер обмена
  1. function smarty_function_math($params, $template)


а это:
PHP:
скопировать код в буфер обмена
  1. array_walk($params, 'strToInt');
  2.  
  3. function strToInt(&$val, $key){
  4.  
  5.   $val = (int)$val;
  6.  
  7. }


перед
PHP:
скопировать код в буфер обмена
  1. foreach($params as $key => $val) {
 
 Top
Bio man
Отправлено: 02 Июня, 2012 - 20:25:26
Post Id


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


Покинул форум
Сообщений всего: 2751
Дата рег-ции: Июль 2010  
Откуда: Даугавпилс, Латвия


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




Extazy
я в ЛС тебе ответил что делать, почему не сделал?
(Добавление)
Преврати это
PHP:
скопировать код в буфер обмена
  1. array_walk($params, 'strToInt');
  2. function strToInt(&$val, $key){
  3.   $val = (int)$val;
  4. }

в это
 
 Top
Extazy
Отправлено: 02 Июня, 2012 - 20:40:41
Post Id


Посетитель


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


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




ошибка пропала! но теперь я кажется заметил чем она была вызвана.. теперь у меня в коде вот эта строка стала работать неправильно:


$rating и $votes - это числа, взятые из базы...
теперь это функция выводит цифру 1, а должна на одном из примеров 6...
эммм
(Добавление)
всё починил! спасибо большое!!!!!
 
 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