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

Возникла задача в 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
Чем заменить в PHP оператор Switch Case более простым?
    #38848380
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей Смирновесть ли операторы попроще
конечно есть - обыкновенный массив, чтоб меньше писать - массив окончаний
...
Рейтинг: 0 / 0
Чем заменить в PHP оператор Switch Case более простым?
    #38848385
Фотография Алексей Смирнов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилАлексей Смирновесть ли операторы попроще
конечно есть - обыкновенный массив, чтоб меньше писать - массив окончаний

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

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

Код: 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
Чем заменить в PHP оператор Switch Case более простым?
    #38848416
Фотография 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);
...
Рейтинг: 0 / 0
Чем заменить в PHP оператор Switch Case более простым?
    #38848429
Фотография Алексей Смирнов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Чем заменить в PHP оператор Switch Case более простым?
    #38848587
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
Чем заменить в PHP оператор Switch Case более простым?
    #38848650
Фотография Алексей Смирнов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Чем заменить в PHP оператор Switch Case более простым?
    #38850110
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей Смирнов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
Чем заменить в PHP оператор Switch Case более простым?
    #38850213
Фотография Алексей Смирнов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ПрограмёрЯ вот такую пользую (входные параметры те же, что и в цитате) :)
Код: 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
10 сообщений из 10, страница 1 из 1
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Чем заменить в PHP оператор Switch Case более простым?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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