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 :: if-switch

 PHP.SU

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


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

> Без описания
Anagar
Отправлено: 17 Февраля, 2016 - 20:56:08
Post Id


Новичок


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


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




// $info = строка с формы.
if(strlen($info) > 0) {
while($info2 = $info[$info3]) {
if ($info2 == "а"){$total += 1;}
elseif ($info2 == "б"){$total += 2;}
elseif ($info2 == "в"){$total += 3;}
elseif ($info2 == "г"){$total += 4;}
elseif ($info2 == "д"){$total += 5;}
elseif ($info2 == "е"){$total += 6;}
elseif ($info2 == "ё"){$total += 7;}
elseif ($info2 == "ж"){$total += 8;}
elseif ($info2 == "з"){$total += 9;}
elseif ($info2 == "и"){$total += 10;}
elseif ($info2 == "й"){$total += 11;}
elseif ($info2 == "к"){$total += 12;}
elseif ($info2 == "л"){$total += 13;}
elseif ($info2 == "м"){$total += 14;}
elseif ($info2 == "н"){$total += 15;}
elseif ($info2 == "о"){$total += 16;}
elseif ($info2 == "п"){$total += 17;}
elseif ($info2 == "р"){$total += 18;}
elseif ($info2 == "с"){$total += 19;}
elseif ($info2 == "т"){$total += 20;}
elseif ($info2 == "у"){$total += 21;}
elseif ($info2 == "ф"){$total += 22;}
elseif ($info2 == "х"){$total += 23;}
elseif ($info2 == "ц"){$total += 24;}
elseif ($info2 == "ч"){$total += 25;}
elseif ($info2 == "ш"){$total += 26;}
elseif ($info2 == "щ"){$total += 27;}
elseif ($info2 == "ъ"){$total += 28;}
elseif ($info2 == "ы"){$total += 29;}
elseif ($info2 == "ь"){$total += 30;}
elseif ($info2 == "э"){$total += 31;}
elseif ($info2 == "ю"){$total += 32;}
elseif ($info2 == "я"){$total += 33;}
switch ($info2){
case a: $total += 1; break;
case b: $total += 2; break;
case c: $total += 3; break;
case d: $total += 4; break;
case e: $total += 5; break;
case f: $total += 6; break;
case g: $total += 7; break;
case h: $total += 8; break;
case i: $total += 9; break;
case j: $total += 10; break;
case k: $total += 11; break;
case l: $total += 12; break;
case m: $total += 13; break;
case n: $total += 14; break;
case o: $total += 15; break;
case p: $total += 16; break;
case q: $total += 17; break;
case r: $total += 18; break;
case s: $total += 19; break;
case t: $total += 20; break;
case u: $total += 21; break;
case v: $total += 22; break;
case w: $total += 23; break;
case x: $total += 24; break;
case y: $total += 25; break;
case z: $total += 26; break;
}
$info3++;
}
}
echo $total;

Проблема заключается в том, что вариант со switch работает как должно, $total увеличивается, а вариант с if-elseif нет. Я пробовал его тоже под switch переделать, но все равно не работает. как я понял далее проблема в том что условие в if имеет дело с русскими буквами. Почему не if не switch не хотят работать с русскими буквами полученными с массива таким образом как в моем случае?

(Отредактировано автором: 17 Февраля, 2016 - 20:56:40)

 
 Top
Viper
Отправлено: 17 Февраля, 2016 - 21:26:52
Post Id



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


Покинул форум
Сообщений всего: 4555
Дата рег-ции: Февр. 2007  
Откуда: Симферополь


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




Ёбин-бобин...

Anagar пишет:
не хотят работать с русскими буквами полученными с массива таким образом как в моем случае?
кодировка какая?

Да переделайте же в массив соответствий и через if с in_array проверяйте и делайте операции.


-----
Список фильмов с описанием, блекджеком и... для Joomla? -> https://киноархив[dot]com
Демо нового движка для сайта php.su -> php[dot]su, проект на гитхабе
 
 Top
IllusionMH
Отправлено: 17 Февраля, 2016 - 21:27:53
Post Id



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


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


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




Anagar, а сколько байт занимает расская буква "а"? Подмигивание Вы читаете по одному байту, а нужно использовать что-то типа mb_split или как в примере здесь. (и набор if/switch кейсов) лучше заменить на массив (либо вообще на разницу между кодами символов а и текущего)

(Отредактировано автором: 17 Февраля, 2016 - 21:29:47)

 
 Top
Anagar
Отправлено: 18 Февраля, 2016 - 14:18:29
Post Id


Новичок


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


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




Viper пишет:
Ёбин-бобин...

Anagar пишет:
не хотят работать с русскими буквами полученными с массива таким образом как в моем случае?
кодировка какая?

Да переделайте же в массив соответствий и через if с in_array проверяйте и делайте операции.


Кодировка UTF-8 - без BOM. В како массив переделать то?
(Добавление)
IllusionMH пишет:
Anagar, а сколько байт занимает расская буква "а"? Подмигивание Вы читаете по одному байту, а нужно использовать что-то типа mb_split или как в примере здесь. (и набор if/switch кейсов) лучше заменить на массив (либо вообще на разницу между кодами символов а и текущего)


Если не трудно, маленький примерчик приведите пж.) А то я пробвал, чет не очень получается.)
 
 Top
IllusionMH
Отправлено: 18 Февраля, 2016 - 15:05:56
Post Id



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


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


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




Anagar, как пробовали? Показывайте код а там подскажем.
 
 Top
Anagar
Отправлено: 18 Февраля, 2016 - 15:25:46
Post Id


Новичок


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


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




Viper

Все, проблему решил, с русскими помогло это:

$info = "строка..";
str_split($info, 2);

Спс за наводку.

(Отредактировано автором: 18 Февраля, 2016 - 15:27:34)

 
 Top
esterio
Отправлено: 18 Февраля, 2016 - 15:56:41
Post Id



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


Покинул форум
Сообщений всего: 5025
Дата рег-ции: Нояб. 2012  
Откуда: Украина, Львов


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




йопересете. вот еще раз mb_split вместо вот этого
Anagar пишет:
str_split($info, 2);
 
 Top
Anagar
Отправлено: 18 Февраля, 2016 - 16:30:28
Post Id


Новичок


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


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




esterio пишет:
йопересете. вот еще раз mb_split вместо вот этого
Anagar пишет:
str_split($info, 2);


А зачем? Если "это" мне помогло! В чем разница выполнения?
 
 Top
esterio
Отправлено: 18 Февраля, 2016 - 16:34:47
Post Id



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


Покинул форум
Сообщений всего: 5025
Дата рег-ции: Нояб. 2012  
Откуда: Украина, Львов


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




Anagar
В правильности использования функций. mb_* функции созданы как раз для работы с многобайтными строками. А если завтра будет не кирилица, а скажем латынь у которей например 4 байта. Что будете тогда делать?

Ух уж этот ПХП, что не напиши все работает
 
 Top
Мелкий Супермодератор
Отправлено: 18 Февраля, 2016 - 16:45:30
Post Id



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


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


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




Латынь фигня.
Что будете делать с такой строкой:
$info = "It строка..";
Что с ней станет после нарезки по байтам, а не символам?


-----
PostgreSQL DBA
 
 Top
DelphinPRO
Отправлено: 18 Февраля, 2016 - 20:16:17
Post Id



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


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


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




Anagar пишет:
Все, проблему решил, с русскими помогло это:

$info = "строка..";
str_split($info, 2);


Говнокодъ.

Прислушайтесь к советам.
(Добавление)
накидал тут примерчик поаккуратнее

PHP:
скопировать код в буфер обмена
  1.  
  2. $symbols = preg_split('//u', 'abcdefghijklmnopqrstuvwxyz', -1, PREG_SPLIT_NO_EMPTY);
  3. $symbolsCyr = preg_split('//u', 'абвгдеёжзийклмнопрстуфхцчшщъыьэюя', -1, PREG_SPLIT_NO_EMPTY);
  4.  
  5. $symbols = array_reverse($symbols);
  6. $symbolsCyr = array_reverse($symbolsCyr);
  7.  
  8. // $info = строка с формы.     
  9. $total = 0;
  10. if(mb_strlen($info) > 0) {
  11.         $rgInfo = preg_split('//u', $info, -1, PREG_SPLIT_NO_EMPTY);
  12.         $counter = 0;
  13.         while($char = $grInfo[$counter]) {
  14.                 if (array_key_exists($char, $symbols)) {
  15.                         $total += ($symbols[$char] + 1);
  16.                 }
  17.                 if (array_key_exists($char, $symbolsCyr)) {
  18.                         $total += ($symbolsCyr[$char] + 1);
  19.                 }
  20.                 $counter++;
  21.         }
  22. }
  23.  
  24. echo $total;

(Добавление)
Чуть сократил
PHP:
скопировать код в буфер обмена
  1. $alphabet1 = 'abcdefghijklmnopqrstuvwxyz';
  2. $alphabet2 = 'абвгдеёжзийклмнопрстуфхцчшщъыьэюя';
  3. $allSymbols = array_merge(
  4.         array_reverse(preg_split('//u', $alphabet1, -1, PREG_SPLIT_NO_EMPTY)),
  5.         array_reverse(preg_split('//u', $alphabet2, -1, PREG_SPLIT_NO_EMPTY))
  6. );
  7.  
  8. // $info = строка с формы.     
  9. if(mb_strlen($info) > 0) {
  10.         $rgInfo = preg_split('//u', $info, -1, PREG_SPLIT_NO_EMPTY);
  11.         $counter = 0;
  12.         while($char = $rgInfo[$counter++]) {
  13.                 if (array_key_exists($char, $allSymbols)) {
  14.                         $total += ($allSymbols[$char] + 1);
  15.                 }
  16.         }
  17. }
  18.  
  19. echo $total;

(Отредактировано автором: 18 Февраля, 2016 - 20:16:32)



-----
Чем больше узнаю, тем больше я не знаю.
 
 Top
Anagar
Отправлено: 22 Февраля, 2016 - 20:45:51
Post Id


Новичок


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


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




Мелкий пишет:
Латынь фигня.
Что будете делать с такой строкой:
$info = "It строка..";
Что с ней станет после нарезки по байтам, а не символам?


в моем случае я перебираю строку по букве циклом, и в зависимости от того какая буква делаю дело.)) Так что проблем не возникнет.)
(Добавление)
esterio пишет:
Anagar
В правильности использования функций. mb_* функции созданы как раз для работы с многобайтными строками. А если завтра будет не кирилица, а скажем латынь у которей например 4 байта. Что будете тогда делать?

Ух уж этот ПХП, что не напиши все работает


Я прислушался к вашему совету, по отталкиванию от кода клавиши с буквой, мне как раз так удобнее всего. Так что не то не то уже не нужно. Но я понял, перебирать буквы лучше mb.
(Добавление)
DelphinPRO пишет:
Anagar пишет:
Все, проблему решил, с русскими помогло это:

$info = "строка..";
str_split($info, 2);


Говнокодъ.

Прислушайтесь к советам.
(Добавление)
накидал тут примерчик поаккуратнее

PHP:
скопировать код в буфер обмена
  1.  
  2. $symbols = preg_split('//u', 'abcdefghijklmnopqrstuvwxyz', -1, PREG_SPLIT_NO_EMPTY);
  3. $symbolsCyr = preg_split('//u', 'абвгдеёжзийклмнопрстуфхцчшщъыьэюя', -1, PREG_SPLIT_NO_EMPTY);
  4.  
  5. $symbols = array_reverse($symbols);
  6. $symbolsCyr = array_reverse($symbolsCyr);
  7.  
  8. // $info = строка с формы.     
  9. $total = 0;
  10. if(mb_strlen($info) > 0) {
  11.         $rgInfo = preg_split('//u', $info, -1, PREG_SPLIT_NO_EMPTY);
  12.         $counter = 0;
  13.         while($char = $grInfo[$counter]) {
  14.                 if (array_key_exists($char, $symbols)) {
  15.                         $total += ($symbols[$char] + 1);
  16.                 }
  17.                 if (array_key_exists($char, $symbolsCyr)) {
  18.                         $total += ($symbolsCyr[$char] + 1);
  19.                 }
  20.                 $counter++;
  21.         }
  22. }
  23.  
  24. echo $total;

(Добавление)
Чуть сократил
PHP:
скопировать код в буфер обмена
  1. $alphabet1 = 'abcdefghijklmnopqrstuvwxyz';
  2. $alphabet2 = 'абвгдеёжзийклмнопрстуфхцчшщъыьэюя';
  3. $allSymbols = array_merge(
  4.         array_reverse(preg_split('//u', $alphabet1, -1, PREG_SPLIT_NO_EMPTY)),
  5.         array_reverse(preg_split('//u', $alphabet2, -1, PREG_SPLIT_NO_EMPTY))
  6. );
  7.  
  8. // $info = строка с формы.     
  9. if(mb_strlen($info) > 0) {
  10.         $rgInfo = preg_split('//u', $info, -1, PREG_SPLIT_NO_EMPTY);
  11.         $counter = 0;
  12.         while($char = $rgInfo[$counter++]) {
  13.                 if (array_key_exists($char, $allSymbols)) {
  14.                         $total += ($allSymbols[$char] + 1);
  15.                 }
  16.         }
  17. }
  18.  
  19. echo $total;


спс за труды, может так и лучше, воспользуюсь..)

(Отредактировано автором: 22 Февраля, 2016 - 20:49:35)

 
 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