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 :: Версия для печати :: Не работает код в функциях
Форумы портала PHP.SU » » Вопросы новичков » Не работает код в функциях

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

1. Aviator - 02 Декабря, 2011 - 17:46:33 - перейти к сообщению
Добрый день, не могу понять что не так.
Есть программа, которая должна переводить цифры в прописной вид: 5 - пять.
Вариант для единиц:
PHP:
скопировать код в буфер обмена
  1.  
  2. $unit["1"]="Один";
  3. $unit["2"]="Два";
  4. $unit["3"]="Три";
  5. $unit["4"]="Четыре";
  6. $unit["5"]="Пять";
  7. $unit["6"]="Шесть";
  8. $unit["7"]="Семь";
  9. $unit["8"]="Восемь";
  10. $unit["9"]="Девять";
  11.  
  12. $finally == "";
  13.  
  14. for($j = 1;$j <= count($unit);$j++)
  15.                         if($j == $Text[0])
  16.                                 $finally = $finally . $unit[$j]." ";
  17. echo "<center><h1>".$Text." : ".$finally."</h1></center>";

Этот вариант работает.
А этот нет:
PHP:
скопировать код в буфер обмена
  1. $unit["1"]="Один";
  2. $unit["2"]="Два";
  3. $unit["3"]="Три";
  4. $unit["4"]="Четыре";
  5. $unit["5"]="Пять";
  6. $unit["6"]="Шесть";
  7. $unit["7"]="Семь";
  8. $unit["8"]="Восемь";
  9. $unit["9"]="Девять";
  10.  
  11. $finally == "";
  12. function unit()
  13. {
  14.    for($j = 1;$j <= count($unit);$j++)
  15.         if($j == $Text[0])
  16.                 $finally = $finally . $unit[$j]." ";
  17. }
  18. unit();
  19. echo "<center><h1>".$Text." : ".$finally."</h1></center>";

Что не так?
Почему в функции не хочет работать?
2. OrmaJever - 02 Декабря, 2011 - 17:49:58 - перейти к сообщению
кто вас учил числовые индексы масивов в кавычки брать?

во-первых переменая $finally не определена
Aviator пишет:
$finally == "";

во-вторых у функции другая облать видимости и $finally за функцией и в функции разные.

PHP:
скопировать код в буфер обмена
  1. function unit($u)
  2. {
  3.    $finally = "";
  4.    for($j = 1;$j <= count($unit);$j++)
  5.         if($j == $Text[0]) // что такое $Text[0] вобще непонятно
  6.                 $finally = $finally . $u[$j]." ";
  7.    return $finally;
  8. }
  9. echo "<center><h1>".$Text." : ".unit($unit)."</h1></center>";
3. Bio man - 02 Декабря, 2011 - 17:54:08 - перейти к сообщению
global поможет Подмигивание
4. Aviator - 02 Декабря, 2011 - 18:04:49 - перейти к сообщению
Цитата:
кто вас учил числовые индексы масивов в кавычки брать?

Это ассоциативный массив. Была такая идея.
Цитата:
// что такое $Text[0] вобще непонятно

Забыл скопировать строчку:
PHP:
скопировать код в буфер обмена
  1. if (isset($_GET["text"])) $Text = $_GET["text"];

Цитата:
во-вторых у функции другая облать видимости и $finally за функцией и в функции разные.

Ваш вариант, тоже не работает:
PHP:
скопировать код в буфер обмена
  1. if (isset($_GET["text"])) $Text = $_GET["text"];
  2.  
  3. $unit[1]="Один";
  4. $unit[2]="Два";
  5. $unit[3]="Три";
  6. $unit[4]="Четыре";
  7. $unit[5]="Пять";
  8. $unit[6]="Шесть";
  9. $unit[7]="Семь";
  10. $unit[8]="Восемь";
  11. $unit[9]="Девять";
  12.  
  13.  
  14. function unit($u)
  15. {
  16.    $finally = "";
  17.    for($j = 1;$j <= count($unit);$j++)
  18.         if($j == $Text[0])
  19.                 $finally = $finally . $u[$j]." ";
  20.    return $finally;
  21. }
  22. echo "<center><h1>".$Text." : ".unit($unit)."</h1></center>";

Выводит "5:"
(Добавление)
Цитата:
global поможет

Спасибо, помогло.
PHP:
скопировать код в буфер обмена
  1. if (isset($_GET["text"])) $Text = $_GET["text"];
  2.  
  3. $unit[1]="Один";
  4. $unit[2]="Два";
  5. $unit[3]="Три";
  6. $unit[4]="Четыре";
  7. $unit[5]="Пять";
  8. $unit[6]="Шесть";
  9. $unit[7]="Семь";
  10. $unit[8]="Восемь";
  11. $unit[9]="Девять";
  12.  
  13.  
  14. function unit()
  15. {
  16.         global $Text;
  17.         global $unit;
  18.         $finally = "";
  19.            for($j = 1;$j <= count($unit);$j++)
  20.                         if($j == $Text[0])
  21.                                         $finally = $finally . $unit[$j]." ";
  22.    return $finally;
  23. }
  24. echo "<center><h1>".$Text." : ".unit($unit)."</h1></center>";
5. Bio man - 02 Декабря, 2011 - 19:21:49 - перейти к сообщению
Aviator пишет:
PHP:
скопировать код в буфер обмена
  1. if (isset($_GET["text"])) $Text = $_GET["text"];

а что в противном случае? $Text не установлена, то есть нул. по идее почти всегда должен быть else, в вашем случае он должен быть, т.к. вы инициализируете переменную с которой потом работаете, а работать с не существующей переменной не надо
6. Aviator - 02 Декабря, 2011 - 19:32:56 - перейти к сообщению
Цитата:
а что в противном случае? $Text не установлена, то есть нул. по идее почти всегда должен быть else, в вашем случае он должен быть, т.к. вы инициализируете переменную с которой потом работаете, а работать с не существующей переменной не надо

Вы правы, такой вариант приемлен?
PHP:
скопировать код в буфер обмена
  1. if (isset($_GET["text1"]))
  2.         $Text = $_GET["text"];
  3. else {
  4.         echo "<h1>Ошибка! Данные не переданы!</h1>";
  5.         exit;
  6. }
7. Данил_123 - 02 Декабря, 2011 - 19:42:36 - перейти к сообщению
Aviator проверки сами пилите, но я бы решил поставленую задачу так:
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2.  
  3. function LettersToNumbers(){
  4. $arr=array("один" => 1, "два" => 2, "три" => 3, "четыре" => 4, "пять" => 5);
  5. $number = $_GET[number];
  6. $text = array_search($number, $arr);
  7. return $text;
  8. }
  9.  
  10. print "Цисло: ".$_GET[number]." , пишется: ".LettersToNumbers();
  11.  
  12. ?>
8. Aviator - 02 Декабря, 2011 - 19:49:49 - перейти к сообщению
Цитата:
Aviator проверки сами пилите, но я бы решил поставленую задачу так:

Да вариант хороший, но про array_search, я не знал. Буду иметь в виду.
9. Bio man - 02 Декабря, 2011 - 20:03:50 - перейти к сообщению
Aviator пишет:
Вы правы, такой вариант приемлен?
PHP:
для начала да.
в чем состоит ваша задача? если я правильно понял, не проще сделать так?
PHP:
скопировать код в буфер обмена
  1. function unit()
  2. {
  3.    global $Text, $unit;
  4.    return $unit[(int)$Text];
  5. }

эт если $Text число
и сделай так
PHP:
скопировать код в буфер обмена
  1. $unit[0]="Ошибка";

если не надо выводить 0
10. Данил_123 - 02 Декабря, 2011 - 20:08:22 - перейти к сообщению
Bio man на сколько понял я, автору нужно веденное число преобразовать в текст.. Где работа с массивом
11. Aviator - 02 Декабря, 2011 - 20:16:36 - перейти к сообщению
Интересно. Возьму на заметку.
12. Bio man - 02 Декабря, 2011 - 20:24:33 - перейти к сообщению
Данил_123 пишет:
Где работа с массивом
вот она
Bio man пишет:
13. Данил_123 - 02 Декабря, 2011 - 20:30:26 - перейти к сообщению
Bio man это преобразование переменной tехt в целое число.. Может ошибаюсь, но var_dump((int)$text) при tехt равной "один" не вернет 1(единицу)..
зы: может не прав, не читал код автора, только вопрос
14. OrmaJever - 02 Декабря, 2011 - 21:08:17 - перейти к сообщению
Aviator пишет:
Забыл скопировать строчку:
PHP:
скопировать код в буфер обмена
  1. if (isset($_GET["text"])) $Text = $_GET["text"];

Когда читал так и хотел сказать что это дурной тон, а потом глянул и увидел что это прям тут же вылезло боком когда дочитал пост.
Aviator пишет:
Ваш вариант, тоже не работает:

Не работает потому что переменая $Text обьявлена в глобальном пространстве и в функции её просто нет. А что бы такого небыло нужно использовать суперглобальные масивы на прямую а не через левую переменую
PHP:
скопировать код в буфер обмена
  1. $_GET["text"] = isset($_GET['text']) ? $_GET['text'] : '';
  2. // и в функции условие будет такое
  3. if($j == $_GET['text'][0]) ...
  4.  

ах да, использовать в функциях ключевое слово global тоже не хорошо, оно существено замедляет скрипт.
15. Aviator - 02 Декабря, 2011 - 21:10:23 - перейти к сообщению
Цитата:
Не работает потому что переменая $Text обьявлена в глобальном пространстве и в функции её просто нет. А что бы такого небыло нужно использовать суперглобальные масивы на прямую а не через левую переменую

Уже разобрался. Спасибо.

 

Powered by ExBB FM 1.0 RC1