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

Т.е.

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 при задании номера месяца и возврате строки месяца, но не наоборот.

Solutions Collecting From Web of "В PHP задана строка месяца, такая как «Ноябрь», как я могу вернуть 11 без использования инструкции 12-разрядного переключателя?"

Пытаться

 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.000003s против 0,000002s, тогда как преобразование времени составляет 0.000060s на моем компьютере (чтение: может отличаться на другом компьютере).

Как насчет использования 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 месяцев, а не только на ноябрь 😉

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

 $t = strtotime("March"); echo date('n',$t); 

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

 $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>"; }; 

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

 $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)];