Каков самый простой самый простой способ узнать, является ли число / переменная нечетной или даже PHP? Это как-то связано с модом?
Я пробовал несколько скриптов, но .. Google не доставляет в настоящий момент.
Вы были правы, думая, что мода – хорошее место для начала. Вот выражение, которое вернет true, если $number
is even, false, если нечетно:
$number % 2 == 0
Работает для каждого целочисленного значения PHP , см. Также Арифметические операторы PHP .
Пример:
$number = 20; if ($number % 2 == 0) { print "It's even"; }
Вывод:
Это даже
Другим вариантом является простая проверка бит.
n & 1
например:
if ( $num & 1 ) { //odd } else { //even }
Да, используя мод
$even = ($num % 2 == 0); $odd = ($num % 2 != 0);
Другой вариант – проверить, является ли последняя цифра четным числом:
$value = "1024";// A Number $even = array(0, 2, 4, 6, 8); if(in_array(substr($value, -1),$even)){ // Even Number }else{ // Odd Number }
Или, чтобы сделать это быстрее, используйте isset()
вместо array_search
:
$value = "1024";// A Number $even = array(0 => 1, 2 => 1, 4 => 1, 6 => 1, 8 => 1); if(isset($even[substr($value, -1)]){ // Even Number }else{ // Odd Number }
Или сделать это быстрее ( иногда проигрывает mod operator
):
$even = array(0, 2, 4, 6, 8); if(in_array(substr($number, -1),$even)){ // Even Number }else{ // Odd Number }
Вот тест времени как доказательство моих результатов.
(bool)($number & 1)
или
(bool)(~ $number & 1)
Я немного is_int
и обнаружил, что между mod, is_int
и &
-оператором мода является самым быстрым, за которым следует & -оператор. is_int
почти в 4 раза медленнее, чем мода.
Для целей тестирования я использовал следующий код:
$number = 13; $before = microtime(true); for ($i=0; $i<100000; $i++) { $test = ($number%2?true:false); } $after = microtime(true); echo $after-$before." seconds mod<br>"; $before = microtime(true); for ($i=0; $i<100000; $i++) { $test = (!is_int($number/2)?true:false); } $after = microtime(true); echo $after-$before." seconds is_int<br>"; $before = microtime(true); for ($i=0; $i<100000; $i++) { $test = ($number&1?true:false); } $after = microtime(true); echo $after-$before." seconds & operator<br>";
Результаты, полученные мной, были довольно последовательными. Вот пример:
0.041879177093506 seconds mod 0.15969395637512 seconds is_int 0.044223070144653 seconds & operator
Хотя все ответы хороши и правильны, простое решение в одной строке:
$check = 9;
или:
echo ($check & 1 ? 'Odd' : 'Even');
или:
echo ($check % 2 ? 'Odd' : 'Even');
работает очень хорошо.
Все четные числа, деленные на 2, приведут к целому числу
$number = 4; if(is_int($number/2)) { echo("Integer"); } else { echo("Not Integer"); }
//for numbers n [0,1,2,3,4....] if((n+2)%2==1) { //odd }else { //even }
Ноль – четное число. Другими словами, его четность – качество целого числа четное или нечетное – четное. Простейший способ доказать равенство нулю – это проверить, что он соответствует определению «четный»: он представляет собой целое число, кратное 2, в частности 0 × 2. В результате нуль имеет все свойства, характеризующие четные числа: 0 делится на 2, 0 окружен с обеих сторон нечетными числами, 0 – сумма целого числа (0) с самим собой, а набор из 0 объектов можно разбить на два равных множества. от http://ru.wikipedia.org/wiki/Parity_of_zero
Я делаю предположение, что есть счетчик уже на месте. в $ i, который увеличивается в конце цикла. Это работает для меня, используя сокращенный запрос.
$row_pos = ($i & 1) ? 'odd' : 'even';
Итак, что это делает, ну, он запрашивает заявление, которое мы делаем, в сущности, $ i является нечетным, в зависимости от того, будет ли его истинное или ложное определять, что возвращается. Возвращаемое значение заполняет нашу переменную $ row_pos
Мое использование этого заключается в том, чтобы поместить его внутри цикла foreach, прямо перед тем, как он мне понадобится. Это делает его очень эффективным одним лайнером, чтобы дать мне соответствующие имена классов, потому что у меня уже есть счетчик для того, чтобы идентификатор использовал позже в программе. Это краткий пример того, как я буду использовать эту часть.
<div class='row-{$row_pos}'> random data <div>
Это дает мне нечетные и четные классы в каждой строке, поэтому я могу использовать правильный класс и нарисовать напечатанные результаты на странице.
Полный пример того, что я использую, отмечает, что идентификатор имеет счетчик, примененный к нему, и класс использует мой нечетный / равномерный результат:
$i=0; foreach ($a as $k => $v) { $row_pos = ($i & 1) ? 'odd' : 'even'; echo "<div id='A{$i}' class='row-{$row_pos}'>{$v['f_name']} {$v['l_name']} - {$v['amount']} - {$v['date']}</div>\n"; $i++; }
в общем, это дает мне очень простой способ создать симпатичную таблицу.
Этот код проверяет, является ли число нечетным или даже на PHP. В примере $a
равно 2
и вы получите четное число. Если вам нужно нечетное значение, измените значение $a
$a=2; if($a %2 == 0){ echo "<h3>This Number is <b>$a</b> Even</h3>"; }else{ echo "<h3>This Number is <b>$a</b> Odd</h3>"; }
PHP преобразует нуль и пустую строку автоматически в нуль. Это происходит и с модулем. Следовательно, код
$number % 2 == 0 or !($number & 1)
со значением $ number = '' или $ number = null возвращает true. Я проверяю его на несколько больше:
function testEven($pArg){ if(is_int($pArg) === true){ $p = ($pArg % 2); if($p== 0){ print "The input '".$pArg."' is even.<br>"; }else{ print "The input '".$pArg."' is odd.<br>"; } }else{ print "The input '".$pArg."' is not a number.<br>"; } } The print is there for testing purposes, hence in practice it becomes: function testEven($pArg){ if(is_int($pArg)=== true){ return $pArg%2; } return false; }
Эта функция возвращает 1 для любого нечетного числа, 0 для любого четного числа и false, если оно не является числом. Я всегда пишу === true или === false, чтобы позволить себе (и другим программистам) знать, что тест имеет значение.
$before = microtime(true); $n = 1000; $numbers = range(1,$n); $cube_numbers = array_map('cube',$numbers); function cube($n){ $msg ='even'; if($n%2 !=0){ $msg = 'odd'; } return "The Number is $n is ".$msg; } foreach($cube_numbers as $cube){ echo $cube . "<br/>"; } $after = microtime(true); echo $after-$before. 'seconds';
Попробуй это,
$number = 10; switch ($number%2) { case 0: echo "It's even"; break; default: echo "It's odd"; }