Я сделал функцию, которая не полагается на функцию PHP date();
, поскольку она не нужна, но также сделала ее настолько компактной и настолько короткой, насколько я думаю, в настоящее время возможной.
Код: (всего 121 байт)
function ordinal($i) { // PHP 5.2 and later
return($i.(($j=abs($i)%100)>10&&$j<14?'th':(($j%=10)>0&&$j<4?['st', 'nd', 'rd'][$j-1]:'th')));
}
Более компактный код ниже.
Он работает следующим образом :
printf("The %s hour.\n", ordinal(0)); // The 0th hour.
printf("The %s ossicle.\n", ordinal(1)); // The 1st ossicle.
printf("The %s cat.\n", ordinal(12)); // The 12th cat.
printf("The %s item.\n", ordinal(-23)); // The -23rd item.
Что нужно знать об этой функции :
- Он работает с отрицательными целыми числами так же, как положительные целые числа, и сохраняет знак.
- Возвращает 11-е, 12-е, 13-е,811-е, 812-е, 813-е и т. Д. Для чисел -надцать , как и ожидалось.
- Он не проверяет десятичные дроби, но оставляет их на месте (используйте
floor($i)
, round($i)
,или ceil($i)
в начале последнего оператора возврата. - Вы также можете добавить
format_number($i)
в начале последнего оператора возврата, чтобы получить целое число через запятую (если вы отображаете тысячи,миллионы и т. д.). - Вы можете просто удалить
$i
из начала оператора return, есливы хотите вернуть только порядковый суффикс без введенного вами значения.
Эта функция работает с PHP 5.2, выпущенной в ноябре 2006 года, исключительно из-за синтаксиса короткого массива.Если у вас есть версия до этого, пожалуйста, обновите, потому что вы почти на десять лет устарели!В противном случае просто замените встроенную строку ['st', 'nd', 'rd']
на временную переменную, содержащую array('st', 'nd', 'rd');
.
Та же функция (без возврата ввода), но в разобранном виде моя короткая функция для лучшего понимания:
function ordinal($i) {
$j = abs($i); // make negatives into positives
$j = $j%100; // modulo 100; deal only with ones and tens; 0 through 99
if($j>10 && $j<14) // if $j is over 10, but below 14 (so we deal with 11 to 13)
return('th'); // always return 'th' for 11th, 13th, 62912th, etc.
$j = $j%10; // modulo 10; deal only with ones; 0 through 9
if($j==1) // 1st, 21st, 31st, 971st
return('st');
if($j==2) // 2nd, 22nd, 32nd, 582nd
return('nd'); //
if($j==3) // 3rd, 23rd, 33rd, 253rd
return('rd');
return('th'); // everything else will suffixed with 'th' including 0th
}
Обновление кода :
Вот модифицированная версия, которая на 14 байт короче (всего 107 байт):
function ordinal($i) {
return $i.(($j=abs($i)%100)>10&&$j<14?'th':@['th','st','nd','rd'][$j%10]?:'th');
}
Или длякак можно короче, на 25 байт короче (всего 96 байт):
function o($i){return $i.(($j=abs($i)%100)>10&&$j<14?'th':@['th','st','nd','rd'][$j%10]?:'th');}
С помощью этой последней функции просто вызовите o(121);
, и она будет действовать точно так же, как и другие функции, перечисленные мной.
Обновление кода # 2 :
Бен и я работал вместе и сократил его на 38 байт (всего 83 байта):
function o($i){return$i.@(($j=abs($i)%100)>10&&$j<14?th:[th,st,nd,rd][$j%10]?:th);}
Мы не думаем, что оно может стать короче этого!Тем не менее, желание быть доказано неправым.:)
Надеюсь, вам всем понравится.