В PHP задана строка месяца, такая как «ноябрь», как я могу вернуть 11, не используя оператор переключения 12 частей? - PullRequest
8 голосов
/ 24 апреля 2010

Т.е.

Month        Returns
January      1
February     2
March        3
April        4
May          5
June         6
July         7
August       8
September    9
October      10
November     11
December     12

Я видел примеры использования mktime, когда дан номер месяца и возвращена строка месяца, но не наоборот.

Ответы [ 6 ]

22 голосов
/ 24 апреля 2010

Попробуйте

echo date('n', strtotime('November')); // returns 11

Если вам приходится делать это часто, вы можете рассмотреть возможность использования массива с жестко заданными значениями:

$months = array( 1 => 'January', 2 => 'February', 3 => 'March', 4 => 'April',
                 5 => 'May',     6 => 'June',     7 => 'July',  8 => 'August',
                 9 => 'September', 10 => 'October', 11 => 'November',
                 12 => 'December');

Можно сделать и наоборот, используя имена для ключей и цифры для значений.

С именами для значений, которые вы делаете

echo array_search('November', $months); // returns 11

и с именами для ключей, которые вы делаете

echo $months['November']; // returns 11

Я считаю, что использование чисел для клавиш несколько лучше в целом , хотя для вашего UseCase подход имен для клавиш, вероятно, более удобен. Если в массиве всего 12 значений, разница между массивами не должна быть большой.

В быстром тесте было отмечено различие в 0,000003 с против 0,000002 с, тогда как преобразование времени на моем компьютере занимает 0,000060 с (читай: на другом компьютере может отличаться).

7 голосов
/ 24 апреля 2010

Как насчет использования strtotime() для преобразования November в метку времени, а затем date() функция с форматом n для получения соответствующего числа:

$ts = strtotime('november');
echo date('n', $ts);

Дает следующий вывод:

11


И, просто для удовольствия, часть кода, такого как следующий:

$months = array('January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December', );
foreach ($months as $m) {
    $ts = strtotime($m);
    echo $m . ' : ' . date('n', $ts) . '<br />';
}

выдаст вам список всех месяцев с соответствующими номерами, показывая, что эта идея будет работать в течение всех 12 месяцев, а не только ноября; -)

5 голосов
/ 24 апреля 2010

Не могу представить, что это более эффективно, но работает

$t = strtotime("March");
echo date('n',$t);
1 голос
/ 24 апреля 2010
$months = array('January', 'February', 'March', 'April', 'May', 'June', 
                'July', 'August', 'September', 'October', 'November', 'December', );
foreach ($months as $m) {
    echo $m."=".date('n', strtotime($m))."<br>";
};
1 голос
/ 24 апреля 2010

Единственное, что я могу придумать, - установить каждую строку как переменную и сделать ее = соответствующим числом. Но с другой стороны, я довольно новичок, поэтому я очень хочу посмотреть, есть ли более простые способы (=

0 голосов
/ 24 апреля 2010

В зависимости от вашего сценария, вероятно, наиболее эффективным решением будет создание ассоциативного массива, подобного:

$months = array("january" => 1, "february" => 2, "march" => 3, "april" => 4, "may" => 5, "june" => 6, "july" => 7, "august" => 8, "september" => 9, "october" => 10, "november" => 11, "december" => 12);

И тогда ваши поиски очень просты:

$month = "Nobember";
$monthNumber = $months[strtolower($month)];
...