Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Чем заменить в PHP оператор Switch Case более простым? / 10 сообщений из 10, страница 1 из 1
05.01.2015, 12:23
    #38848368
Алексей Смирнов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чем заменить в PHP оператор Switch Case более простым?
Добрый день!

Возникла задача в PHP вывести на экран обозначения количества часов, например:
1 час, 2 часа, 3 часа, 20 часов и т.д. (чтобы функция сама определяла окончание слова из вариантов "час", "часа", "часов".).

С использованием Switch Case получается довольно громоздская конструкция, есть ли операторы попроще. Или почему я не могу после Case написать несколько вариантов значений (как в Visual Basic например), а должен для каждого значения писать Case? И ещё раздражает, что в конце каждого case надо ставить break. Про точку с запятой после каждой строчки вообще молчу. У меня большинство ошибок в коде от того, что забываю поставить точку с запятой, а потом три часа ищу почему вместо страницы браузер отображает пустой экран.

Можно ли как-то упростить код, приведенный ниже?:

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
// получаем 2-х значное число из правых крайних цифр
$intNum = (int)Right($strNumber,2);
// определяем подпись
if ($intNum<20) {
  // определяем подпись для чисел от 0 до 19
  switch($intNum) {
    case 0: $strSign = 'часов'; break;
    case 1: $strSign = 'час'; break;
    case 2: $strSign = 'часа'; break;
    case 3: $strSign = 'часа'; break;
    case 4: $strSign = 'часа'; break;
    case 5: $strSign = 'часов'; break;
    case 6: $strSign = 'часов'; break;
    case 7: $strSign = 'часов'; break;
    case 8: $strSign = 'часов'; break;
    case 9: $strSign = 'часов'; break;
    case 10: $strSign = 'часов'; break;
    case 11: $strSign = 'часов'; break;
    case 12: $strSign = 'часов'; break;
    case 13: $strSign = 'часов'; break;
    case 14: $strSign = 'часов'; break;
    case 15: $strSign = 'часов'; break;
    case 16: $strSign = 'часов'; break;
    case 17: $strSign = 'часов'; break;
    case 18: $strSign = 'часов'; break;
    case 19: $strSign = 'часов'; break;
} else {
  // определяем крайнее правое 1-значное число
  $intNum = (int)Right($strNumber,1);
  // определяем подпись для чисел от 0 до 9
  switch($intNum) {
    case 0: $strSign = 'часов'; break;
    case 1: $strSign = 'час'; break;
    case 2: $strSign = 'часа'; break;
    case 3: $strSign = 'часа'; break;
    case 4: $strSign = 'часа'; break;
    case 5: $strSign = 'часов'; break;
    case 6: $strSign = 'часов'; break;
    case 7: $strSign = 'часов'; break;
    case 8: $strSign = 'часов'; break;
    case 9: $strSign = 'часов'; break;
  }
}
// ура, наконец-то результат
return $strSign;
...
Рейтинг: 0 / 0
05.01.2015, 12:45
    #38848380
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чем заменить в PHP оператор Switch Case более простым?
Алексей Смирновесть ли операторы попроще
конечно есть - обыкновенный массив, чтоб меньше писать - массив окончаний
...
Рейтинг: 0 / 0
05.01.2015, 12:52
    #38848385
Алексей Смирнов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чем заменить в PHP оператор Switch Case более простым?
ИзопропилАлексей Смирновесть ли операторы попроще
конечно есть - обыкновенный массив, чтоб меньше писать - массив окончаний

Ну как вариант, да. Спасибо.
...
Рейтинг: 0 / 0
05.01.2015, 13:17
    #38848401
Алексей Смирнов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чем заменить в PHP оператор Switch Case более простым?
ИзопропилАлексей Смирновесть ли операторы попроще
конечно есть - обыкновенный массив, чтоб меньше писать - массив окончаний

У меня вот так получилось (не намного легче конечно):

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
// ФУНКЦИЯ: возвращает обозначение количества часов
// $intHours - количество часов
// $blnNumeral = False - признак числительного падежа
function GetHoursSign($intHours, $blnNumeral = false) {
	// создание массива вариантов обозначений
	if ($blnNumeral) $strmVar = array('ов','а','ов');
	else $strmVar = array('ов','','а');
	// преобразование в строку
	$strNum = strval($intHours);
	// ограничение пробелов
	$strNum = trim($strNum);
	// добавление левого нуля, если один символ
	if (strlen($strNum==1)) $strNum = '0'.$strNum;
	// заполнение массива обозначений
	$strmSign[] = $strmVar[0];
	$strmSign[] = $strmVar[1];
	for ($i=2;$i<=4;$i++) { $strmSign[] = $strmVar[2]; }
	for ($i=5;$i<=19;$i++) { $strmSign[] = $strmVar[0]; }
	// выделение правого 2-х значного числа
	$strNum = Right($strNum,2);
	// преобразование в число
	$intNum = (int)$strNum;
	// определение значения
	if ($intNum<20) $strSign = 'час'.$strmSign[$intNum];
	else {
		// выделение правого 1-значного числа
		$strNum = Right($strNum,1);	
		// преобразование в число
		$intNum = (int)$strNum;		
		// определение подписи
		$strSign = 'час'.$strmSign[$intNum];
	}
	// сохранение результата
	return $strSign;
}
...
Рейтинг: 0 / 0
05.01.2015, 13:47
    #38848416
ScareCrow
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чем заменить в PHP оператор Switch Case более простым?
https://github.com/translate/l10n-guide/blob/master/docs/l10n/pluralforms.rst
Код: php
1.
plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);
...
Рейтинг: 0 / 0
05.01.2015, 14:02
    #38848429
Алексей Смирнов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чем заменить в PHP оператор Switch Case более простым?
ScareCrow https://github.com/translate/l10n-guide/blob/master/docs/l10n/pluralforms.rst
Код: php
1.
plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);



Спасибо, можно и так). Вы заменили switch case, на if и записали это в одну строку. Да, так компактней. Про %10, %100 я не знал.
...
Рейтинг: 0 / 0
05.01.2015, 18:51
    #38848587
didgik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чем заменить в PHP оператор Switch Case более простым?
Алексей Смирнов,

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
  function word_by_number($number,$words)
  {
    if($number>100) $number = $number % 100;
    if($number>20) $number = $number % 10;
    if($number==1) $word = $words[0];
    else if( $number<5 ) $word = $words[1];
    else $word = $words[2];
    return $word;
  }

  word_by_number($number,array("час","часа","часов");
...
Рейтинг: 0 / 0
05.01.2015, 20:35
    #38848650
Алексей Смирнов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чем заменить в PHP оператор Switch Case более простым?
didgikАлексей Смирнов,

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
  function word_by_number($number,$words)
  {
    if($number>100) $number = $number % 100;
    if($number>20) $number = $number % 10;
    if($number==1) $word = $words[0];
    else if( $number<5 ) $word = $words[1];
    else $word = $words[2];
    return $word;
  }

  word_by_number($number,array("час","часа","часов");



Спасибо) У вас вообще универсальная функция получилась на любые слова.
...
Рейтинг: 0 / 0
08.01.2015, 12:53
    #38850110
Програмёр
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чем заменить в PHP оператор Switch Case более простым?
Алексей СмирновdidgikАлексей Смирнов,

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
  function word_by_number($number,$words)
  {
    if($number>100) $number = $number % 100;
    if($number>20) $number = $number % 10;
    if($number==1) $word = $words[0];
    else if( $number<5 ) $word = $words[1];
    else $word = $words[2];
    return $word;
  }

  word_by_number($number,array("час","часа","часов");



Спасибо) У вас вообще универсальная функция получилась на любые слова.

Я вот такую пользую (входные параметры те же, что и в цитате) :)
Код: php
1.
2.
3.
	function cases($num, $cases){
		return ($num/10>>0)==1 || ((($num%10)-1)&(-4)) ? $cases[2] : ((($num%10)-1)&(-1) ? $cases[1] : $cases[0]);
	}
...
Рейтинг: 0 / 0
08.01.2015, 15:37
    #38850213
Алексей Смирнов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Чем заменить в PHP оператор Switch Case более простым?
ПрограмёрЯ вот такую пользую (входные параметры те же, что и в цитате) :)
Код: php
1.
2.
3.
	function cases($num, $cases){
		return ($num/10>>0)==1 || ((($num%10)-1)&(-4)) ? $cases[2] : ((($num%10)-1)&(-1) ? $cases[1] : $cases[0]);
	}



Ок. Спасибо!
...
Рейтинг: 0 / 0
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Чем заменить в PHP оператор Switch Case более простым? / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]