Testez si le nombre est pair ou impair

262

Quelle est la manière la plus simple et la plus simple de savoir si un nombre / variable est impair ou même en PHP? Est-ce quelque chose à voir avec le mod?

J'ai essayé quelques scripts mais ... Google ne livre pas pour le moment.

user1022585
la source
9
mod est le terme générique raccourci pour «modulo», alias arithmétique modulaire
Marc B
1
Plus d'informations ici, y compris: Pour déterminer impair ou même il est plus rapide et plus efficace d'utiliser l' opérateur au niveau du bit : & $a=3; if($a&1){echo 'odd';}else{echo 'even';} //returns 'odd'
ashleedawg

Réponses:

558

Vous aviez raison de penser que le mod était un bon point de départ. Voici une expression qui retournera vrai si $numberest pair, faux si impair:

$number % 2 == 0

Fonctionne pour chaque valeur PHP entière , voir aussi Opérateurs arithmétiques PHP .

Exemple:

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

Production:

C'est même

Tim Cooper
la source
10
Si vous l'utilisez en boucles ou en grandes quantités, vous voudrez peut-être considérer le bitcheck suggéré par Arius2038, qui est très rapide. Le bitcheck est ma méthode préférée pour les contrôles pairs / impairs.
Martijn
Fonctionne bien, mais je me demande simplement quelle est la logique derrière cela? Pourquoi est-ce qu'une valeur de vrai est donnée si "10 == 0"?
snlan
La logique est que tout nombre pair est divisible par 2 sans reste. Si vous avez utilisé $ numéro% 10 et que votre numéro $ était 20, cela retournerait vrai, mais pas si votre numéro $ était 22. Vous pourriez utiliser $ numéro% 10 si vous essayiez de trouver chaque 10ème élément dans une boucle par exemple .
crdunst
1
@Tim, si 5% 2 = 1. Le logica est 2 * 2 + 1 = 5. Comment obtenir le 2 en php?
Hendry Tanaka
1
@Hendry - que demandez-vous exactement? Comment obtenir le quotient d'une division en nombre entier, ou ...? Si c'est ce que vous voulez dire, il vous suffit de plancher () le résultat; étage (5/2) = 2
Joey Sabey
196

Une autre option est une simple vérification des bits.

n & 1

par exemple:

if ( $num & 1 ) {
  //odd
} else {
  //even
}
Pawel Dubiel
la source
1
Ce serait certainement le moyen le plus rapide lorsque vous utilisez des entiers dans un langage comme C, par une grande marge. Quelqu'un a-t-il fait des benchmarks pour déterminer si cela est vrai aussi pour PHP?
thomasrutter
1
C'est probablement le moyen le plus rapide, si le moteur PHP était bien codé.
Rolf
Je dirais que c'est le moyen le plus rapide et le plus simple. Parfait.
Robbiegod
4
Le lien ci-dessus est mort. Voici une autre bonne explication: catonmat.net/blog/low-level-bit-hacks-you-absolutely-must-know
kasimir
23

Oui en utilisant le mod

$even = ($num % 2 == 0);
$odd = ($num % 2 != 0);
Aaron W.
la source
8

Bien que toutes les réponses soient bonnes et correctes, une solution simple en une seule ligne est:

$check = 9;

Soit:

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

ou:

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

fonctionne très bien.

Tarik
la source
7
(bool)($number & 1)

ou

(bool)(~ $number & 1)
Olegs
la source
3
Ceci est un opérateur au niveau du bit, je crois donc à moins que vous ne sachiez ce que vous faites avec cette fantaisie, j'éviterais cette syntaxe.
danhere
1
Je dois admirer la syntaxe, les choses qui fonctionnent sans savoir pourquoi, vous rappelle à quel point nous sommes petits dans le monde de la fysique, des mathématiques et, bien, il suffit d'ajouter une ligne sur le numéro 1, pas 2 ...
Jonas Lundman
J'utilise pas mal d'opérateurs bit à bit dans JS. Par exemple if (~string.indexOf("@")) {}au lieu de if (string.indexOf("@") !== -1) {}. Je préfère voir les conditions se traduire par un simple vrai ou faux. Mais oui, cela peut être un peu déroutant pour les personnes qui ne connaissent pas cette syntaxe.
Martin James
7

Une autre option consiste à vérifier si le dernier chiffre est un nombre pair:

$value = "1024";// A Number
$even = array(0, 2, 4, 6, 8);
if(in_array(substr($value, -1),$even)){
  // Even Number
}else{
  // Odd Number
}

Ou pour le rendre plus rapide, utilisez isset()au lieu de 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
}

Ou pour le rendre plus rapide ( bat mod operatorparfois ):

$even = array(0, 2, 4, 6, 8);
if(in_array(substr($number, -1),$even)){
  // Even Number
}else{
  // Odd Number
}

Voici le test de temps comme preuve de mes résultats.

Subin
la source
À Downvoter: Puis-je s'il vous plaît savoir pourquoi vous avez voté contre?
Subin
4
C'est très cher par rapport à d'autres méthodes.
grantwparks
@grantwparks Eh bien, la différence entre l'utilisation de isset & mod n'est que de 0,5007 seconde. Mais, array_search est très cher.
Subin
2
@grantwparks J'ai mis à jour le code pour inclure celui in_arrayqui bat parfois l'opérateur mod.
Subin
1
Une façon de penser intéressante cependant. Il s'agit essentiellement de la version décimale de $num & 1:). Vous pouvez également le faire hexadécimal: tableau (0, 2, 4, 6, 8, A, C, E, F): D.
Matthijs Wessels
5

J'ai fait un peu de test et j'ai découvert qu'entre le mod is_intet l' &opérateur-, le mod est le plus rapide, suivi de près par l'opérateur &. is_intest presque 4 fois plus lent que le mod.

J'ai utilisé le code suivant à des fins de test:

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

Les résultats que j'ai obtenus étaient assez cohérents. Voici un exemple:

0.041879177093506 seconds mod
0.15969395637512 seconds is_int
0.044223070144653 seconds & operator
Ruben Coolen
la source
2
sur mon serveur (5.4.4 / cli / no opcache / i7) le "&" est environ 10% plus rapide que le mod (testé sur un tableau avec des valeurs entières aléatoires)
Pawel Dubiel
3

Tous les nombres pairs divisés par 2 donneront un entier

$number = 4;
if(is_int($number/2))
{
   echo("Integer");
}
else
{
   echo("Not Integer");
}
David S.
la source
2
//for numbers n [0,1,2,3,4....]

if((n+2)%2==1) {
   //odd
}else {
  //even
}

Zéro est un nombre pair. En d'autres termes, sa parité - la qualité d'un entier étant pair ou impair - est paire. Le moyen le plus simple de prouver que zéro est pair est de vérifier qu'il correspond à la définition de "pair": c'est un multiple entier de 2, spécifiquement 0 × 2. Par conséquent, zéro partage toutes les propriétés qui caractérisent les nombres pairs: 0 est divisible par 2, 0 est entouré des deux côtés par des nombres impairs, 0 est la somme d'un entier (0) avec lui-même, et un ensemble de 0 objets peut être divisé en deux ensembles égaux. depuis http://en.wikipedia.org/wiki/Parity_of_zero

sumit
la source
1
Je ne comprends pas. Pourquoi (n + 2)% 2? Dans quels cas renvoie-t-il quelque chose de différent de n% 2?
Pierre-Olivier Vares
2

Ce code vérifie si le nombre est impair ou même en PHP. Dans l'exemple $aest 2et vous obtenez un nombre pair. Si vous avez besoin d'étranges, modifiez la $avaleur

$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>";
}
Narendra Chauhan
la source
2

PHP convertit automatiquement null et une chaîne vide en zéro. Cela se produit également avec modulo. À cet effet, le code

$number % 2 == 0 or !($number & 1)

avec la valeur $ number = '' ou $ number = null, le résultat est true. Je le teste donc un peu plus étendu:

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

Cette fonction renvoie 1 pour tout nombre impair, 0 pour tout nombre pair et false lorsqu'il ne s'agit pas d'un nombre. J'écris toujours === true ou === false pour me faire savoir (et aux autres programmeurs) que le test est comme prévu.

Loek Bergman
la source
2

Vérifiez le nombre pair ou impair sans condition d'utilisation et déclaration de boucle.

Ce travail pour moi ..!

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

jd savaj
la source
1

Je fais l'hypothèse qu'il y a déjà un compteur en place. dans $ i qui est incrémenté à la fin d'une boucle, cela fonctionne pour moi en utilisant une requête abrégée.

$row_pos = ($i & 1) ? 'odd' : 'even';

Alors, qu'est-ce que cela fait, eh bien, il interroge la déclaration que nous faisons essentiellement $ i est impair, selon que son vrai ou son faux décidera de ce qui sera retourné. La valeur renvoyée remplit notre variable $ row_pos

Mon utilisation de ceci est de le placer à l'intérieur de la boucle foreach, juste avant d'en avoir besoin, cela en fait une doublure très efficace pour me donner les noms de classe appropriés, c'est parce que j'ai déjà un compteur pour les identifiants à utiliser plus tard dans le programme. Ceci est un bref exemple de la façon dont j'utiliserai cette partie.

<div class='row-{$row_pos}'> random data <div>

Cela me donne des classes paires et impaires sur chaque ligne afin que je puisse utiliser la classe correcte et rayer mes résultats imprimés sur la page.

L'exemple complet de ce que j'utilise note que l'ID a le compteur qui lui est appliqué et la classe a mon résultat impair / pair qui lui est appliqué .:

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

en résumé, cela me donne un moyen très simple de créer une jolie table.

Chris
la source
0

Essaye ça,

$number = 10;
 switch ($number%2)
 {
 case 0:
 echo "It's even";
 break;
 default:
 echo "It's odd";
 }
Sajjad Hossain
la source
0

Attention, pour certaines raisons, cette condition n'est pas évaluée à VRAI dans une déclaration de boucle for , comme indiqué ci-dessous:

Au début de chaque itération, expr2est évalué. S'il prend la valeur TRUE, la boucle continue et les instructions imbriquées sont exécutées. S'il est évalué à FALSE, l'exécution de la boucle se termine.


Cela ne fonctionne PAS :

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

Cela ne fonctionne PAS :

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

Cela ne fonctionne PAS :

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

Cela fonctionne bien :

for ($i=0; $i<count($str); $i++){
  if ($i % 2 === 1) {
    // echo "-----------\n";
  }
}
NVRM
la source
-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';
user2610558
la source
-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.";
}
Imran Azim
la source
1
Qu'est-ce que cette réponse ajoute que la réponse initialement acceptée ne fait pas?
GordonM
-1

Essayez celui-ci avec le champ #Input

<?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.";
    }
    }
?>
Imran Azim
la source
3
Qu'est-ce que cette réponse ajoute que la réponse initialement acceptée ne fait pas?
GordonM
il prend l'entrée de l'utilisateur et prend une décision sur cette entrée.
Imran Azim
Donc vraiment rien.
GordonM