2013-09-02 3 views
0

Имена персидских дней отличаются от английского, а также начинается неделя в субботу. Так что у меня это название дня недели и функция преобразования номера:Есть ли лучший способ написать эту функцию преобразования имен в php?

function getDayNames($day, $shorten = false, $len = 1, $numeric = false) 
{ 
    $ret = ''; 
    switch (strtolower($day)) { 
     case 'sat': case 'saturday': $ret = 'شنبه'; $n = 1; break; 
     case 'sun': case 'sunday': $ret = 'یکشنبه'; $n = 2; break; 
     case 'mon': case 'monday': $ret = 'دوشنبه'; $n = 3; break; 
     case 'tue': case 'tuesday': $ret = 'سه شنبه'; $n = 4; break; 
     case 'wed': case 'wednesday': $ret = 'چهارشنبه'; $n = 5; break; 
     case 'thu': case 'thursday': $ret = 'پنجشنبه'; $n = 6; break; 
     case 'fri': case 'friday': $ret = 'جمعه'; $n = 7; break; 
    } 
    return ($numeric) ? $n : (($shorten) ? substr($ret, 0, $len) : $ret); 
} 

, и я хочу знать, если есть лучший способ переписать. Использование switch не является идеальным.

Заранее спасибо.

+1

Установите некоторый хэш-словарь (т.е. PHP массив) с английскими строками в качестве ключей и фарси из них в качестве значений. – mvw

+1

Я бы использовал хэш-таблицу (т. Е. Ассоциативный массив) как статическую переменную и искал значения на основе первых трех букв на входе. Но от этого практически ничего не получается, это, безусловно, не значимая разница в производительности, поэтому вы должны использовать наиболее читаемую версию. Но этот 'substr()' is * high * вряд ли будет тем, что вы хотите - в PHP строка представляет собой последовательность байтов, и вы почти наверняка сокращаете символы пополам. Вместо этого используйте 'mb_substr()'. – DaveRandom

+0

@mvw Проблема в том, что у меня есть два ключа, которые я хочу преобразовать, и я не хочу создавать два хеш-словаря с одинаковыми значениями. «sat» и «saturday» должны указывать на то же значение. – Sallar

ответ

2

Возможно arrayify это:

function getDayNames($day, $shorten = false, $len = 1, $numeric = false) { 
    $days = array(
     'sat' => 'شنبه', 
     'sun' => 'یکشنبه', 
     'mon' => 'دوشنبه', 
     'tue' => 'سه شنبه', 
     'wed' => 'چهارشنبه', 
     'thu' => 'پنجشنبه', 
     'fri' => 'جمعه' 
    ); 

    $key = substr(strtolower($day), 0, 3); 
    if (array_key_exists($key, $days) { 
     $ret = $days[$key]; 
    } else { 
     throw new Expection('Day ' . $day . ' not found!'); 
    } 

    return ($numeric) ? (array_search($key, array_keys($days)) + 1) : (($shorten) ? substr($ret, 0, $len) : $ret); 
} 
+0

Спасибо, но как насчет числового значения, которое является номером дня недели? Как мне вернуть «1», если согласованный элемент «сидит» и так далее. – Sallar

+0

Отредактировано, должно работать. –

+0

Здесь есть синтаксическая ошибка: 'if (array_key_exists ($ key, $ days)', но это он. Спасибо :) – Sallar

Смежные вопросы