Перевірте, чи число непарне або парне


261

Який найпростіший і найпростіший спосіб дізнатися, чи число / змінна непарна чи парна в PHP? Це щось стосується мода?

Я спробував кілька сценаріїв, але .. Google наразі не постачає.


9
mod - це загальний скорочений термін для 'modulo', він же модульний арифметичний
Marc B

1
Більш детальну інформацію тут в тому числі: Для того, щоб визначити , непарне або навіть швидше і ефективніше використовувати побітового оператора : & $a=3; if($a&1){echo 'odd';}else{echo 'even';} //returns 'odd'
ashleedawg

Відповіді:


557

Ви мали рацію, думаючи, що мод - це гарне місце для початку. Ось вираз, який поверне справжнє, якщо $numberпарне, хибне, якщо непарне:

$number % 2 == 0

Працює для кожного цілого значення PHP , див. Також Арифметичні оператори PHP .

Приклад:

$number = 20;
if ($number % 2 == 0) {
  print "It's even";
}

Вихід:

Це навіть


10
Якщо ви використовуєте це в циклі або у великих кількостях, ви можете розглянути бітчек, запропонований Arius2038, що дуже швидко. Бітчек - це мій кращий метод для непарних / парних перевірок.
Мартійн

Добре працює, але мені просто цікаво, в чому полягає логіка цього? Чому саме так задається значення true, якщо "10 == 0"?
snlan

Логіка полягає в тому, що будь-яке парне число ділиться на 2 без залишку. Якщо ви використовували $ number% 10, а ваш $ $ було 20, воно повернеться істинним, але не, якщо ваше $ $ було 22. Ви можете використовувати $ number% 10, якщо намагаєтесь знайти кожен 10-й елемент у циклі, наприклад .
crdunst

1
@Tim, якщо 5% 2 = 1. Логіка 2 * 2 + 1 = 5.Як отримати 2 у php?
Хендрі Танака

1
@Hendry - про що ти точно питаєш? Як отримати коефіцієнт для поділу на ціле число, або ...? Якщо це саме ви маєте на увазі, вам просто потрібно залишити () результат; пол (5/2) = 2
Джої Сабей

196

Ще один варіант - проста перевірка бітів.

n & 1

наприклад:

if ( $num & 1 ) {
  //odd
} else {
  //even
}

1
Це, безумовно, було б найшвидшим способом при використанні цілих чисел на мові, як C, з великим запасом. Хтось робив орієнтири, щоб визначити, чи це справедливо і для PHP?
thomasrutter

1
Це, мабуть, найшвидший спосіб, якщо PHP-механізм був добре закодований.
Рольф

Я б сказав, що це найшвидший і прямий шлях вперед. Ідеально.
Роббігод

4
Зверху посилання мертва. Ось ще одне вдале пояснення: catonmat.net/blog/low-level-bit-hacks-you-absgether-must-know
kasimir


8

Хоча всі відповіді хороші і правильні, простим рішенням в одному рядку є:

$check = 9;

або:

echo ($check & 1 ? 'Odd' : 'Even');

або:

echo ($check % 2 ? 'Odd' : 'Even');

працює дуже добре.


7
(bool)($number & 1)

або

(bool)(~ $number & 1)

3
Я вважаю, що це бітовий оператор, якщо ви не знаєте, що ви робите з цією фантазією, я б уникну цього синтаксису.
danhere

1
Мені належить захоплюватися синтаксисом, тим, що працює, не знаючи чому, дає нагадування про те, наскільки ми малі у світі фізики, математики і, ну, просто додайте рядок на номер 1, а не на 2 ...
Йонас Лундман

Я дуже часто використовую побітові оператори в JS. Наприклад if (~string.indexOf("@")) {}замість if (string.indexOf("@") !== -1) {}. Я вважаю за краще, щоб умови призводили до простого істинного чи хибного. Але так, це може трохи заплутати людей, які не знайомі з цим синтаксисом.
Мартін Джеймс

7

Ще один варіант - перевірити, чи є остання цифра парним числом:

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

Ось тест часу як доказ моїх висновків.


Для Downvoter: Чи можу я дізнатися, чому ви порушили?
Субін

4
Це дуже дорого, порівняно з іншими методами.
grantwparks

@grantwparks Ну, різниця між використанням isset & mod становить лише 0,5007 секунди. Але array_search коштує дуже дорого.
Субін

2
@grantwparks У мене є оновлення коду, щоб включити, in_arrayякий іноді б'є оператор мод.
Субін

1
Хоча цікавий спосіб мислення. В основному це десяткова версія $num & 1:). Ви також можете зробити це шістнадцятковим: масив (0, 2, 4, 6, 8, A, C, E, F): D.
Маттайс Весселс

5

Я трохи тестував і виявив, що між модом 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

2
на моєму сервері (5.4.4 / cli / no opcache / i7) "&" приблизно на 10% швидше, ніж мод (тестований на масиві зі випадковими цілими значеннями)
Pawel Dubiel

3

Усі парні числа, розділені на 2, призведе до цілого числа

$number = 4;
if(is_int($number/2))
{
   echo("Integer");
}
else
{
   echo("Not Integer");
}

2
//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://en.wikipedia.org/wiki/PITY_of_zero


1
Я не розумію. Чому (n + 2)% 2? У яких випадках він повертає щось інше, ніж n% 2?
П'єр-Олів'є Варес

2

Цей код перевіряє, чи число непарне або парне в 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>";
}

2

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 для будь-якого парного числа і хибного, коли це не число. Я завжди пишу === true або === false, щоб дозволити собі (та іншим програмістам) знати, що тест виконаний за призначенням.


2

Перевірте парний чи непарний номер без використання умови та заяви циклу.

Ця робота для мене ..!

$(document).ready(function(){
    $("#btn_even_odd").click(function(){
        var arr = ['Even','Odd'];
        var num_even_odd = $("#num_even_odd").val();
        $("#ans_even_odd").html(arr[num_even_odd % 2]);
    });
});
<!DOCTYPE html>
<html>
<head>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
    <title>Check Even Or Odd Number Without Use Condition And Loop Statement.</title>
</head>
<body>
<h4>Check Even Or Odd Number Without Use Condition And Loop Statement.</h4>
<table>
    <tr>
        <th>Enter A Number :</th>
        <td><input type="text" name="num_even_odd" id="num_even_odd" placeholder="Enter Only Number"></td>
    </tr>
    <tr>
        <th>Your Answer Is :</th>
        <td id="ans_even_odd" style="font-size:15px;color:gray;font-weight:900;"></td>
    </tr>
    <tr>
        <td><input type="button" name="btn_even_odd" id="btn_even_odd" value="submit"></td>
    </tr>
</table>
</body>
</html>


1

Я роблю припущення, що лічильник вже існує. в $ 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++;
}

підсумовуючи це, це дає мені дуже простий спосіб створити гарну таблицю.



0

Попередження, з певних причин, ця умова не оцінюється як ІСТИНА в оголошенні циклу for , як показано нижче:

На початку кожної ітерації expr2оцінюється. Якщо вона оцінюється як TRUE, цикл продовжується і вкладені оператори (и) виконуються. Якщо він оцінюється як FALSE, виконання циклу закінчується.


Це НЕ працює:

for ($i=0; $i % 2 === 1 && $i < count($str); $i++){
  // echo "-----------\n";
}

Це НЕ працює:

for ($i=0; ($i % 2 === 1) && $i < count($str); $i++){
  // echo "-----------\n";
}

Це НЕ працює:

for ($i=0; ($i % 2) === 1 && $i < count($str); $i++){
  // echo "-----------\n";
}

Це працює добре :

for ($i=0; $i<count($str); $i++){
  if ($i % 2 === 1) {
    // echo "-----------\n";
  }
}

-1
$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';

-1
//checking even and odd
$num =14;

$even = ($num % 2 == 0);
$odd = ($num % 2 != 0);

if($even){
    echo "Number is even.";
} else {
    echo "Number is odd.";
}

1
Що ця відповідь додає, що спочатку прийнята відповідь не відповідає?
GordonM

-1

Спробуйте це з полем # Введення

<?php
    //checking even and odd
    echo '<form action="" method="post">';
    echo "<input type='text' name='num'>\n";
    echo "<button type='submit' name='submit'>Check</button>\n";
    echo "</form>";

    $num = 0;
    if ($_SERVER["REQUEST_METHOD"] == "POST") {
      if (empty($_POST["num"])) {
        $numErr = "<span style ='color: red;'>Number is required.</span>";
        echo $numErr;
        die();
      } else {
          $num = $_POST["num"];
      }


    $even = ($num % 2 == 0);
    $odd = ($num % 2 != 0);
    if ($num > 0){
        if($even){
            echo "Number is even.";
        } else {
            echo "Number is odd.";
        }
    } else {
        echo "Not a number.";
    }
    }
?>

3
Що ця відповідь додає, що спочатку прийнята відповідь не відповідає?
GordonM

він приймає дані від користувача та приймає рішення щодо цього вводу.
Імран Азім

Так що насправді нічого.
GordonM
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.