Verifica se il numero è pari o dispari


261

Qual è il modo più semplice di base per scoprire se un numero / variabile è pari o dispari in PHP? Ha a che fare con la mod?

Ho provato alcuni script ma .. google non sta erogando al momento.


9
mod è il termine generico abbreviato per 'modulo', alias aritmetica modulare
Marc B

1
Maggiori informazioni qui tra cui: Per determinare la dispari o addirittura è più veloce ed efficiente utilizzare l' operatore bit a bit : & $a=3; if($a&1){echo 'odd';}else{echo 'even';} //returns 'odd'
ashleedawg

Risposte:


557

Avevi ragione nel pensare che la mod fosse un buon punto di partenza. Ecco un'espressione che restituirà vero se $numberè pari, falso se dispari:

$number % 2 == 0

Funziona con ogni valore PHP intero , vedi anche Operatori aritmetici PHP .

Esempio:

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

Produzione:

È pari


10
Se lo usi in loop o in grandi quantità, potresti considerare il bitcheck suggerito da Arius2038, che è molto veloce. Il bitcheck è il mio metodo preferito per i controlli pari / dispari.
Martijn,

Funziona bene ma mi chiedo solo quale sia la logica dietro questo? Perché viene dato un valore vero se "10 == 0"?
snlan

La logica è che qualsiasi numero pari è divisibile per 2 senza resto. Se hai usato $ numero% 10 e il tuo numero $ era 20, restituirebbe vero, ma non se il tuo numero $ fosse 22. Potresti usare $ numero% 10 se, ad esempio, cercassi di trovare ogni decimo oggetto in un ciclo .
crdunst,

1
@Tim, se 5% 2 = 1. La logica è 2 * 2 + 1 = 5.Come ottenere il 2 in php?
Hendry Tanaka,

1
@Hendry - cosa stai chiedendo esattamente? Come ottenere il quoziente per una divisione come un numero intero o ...? Se questo è ciò che vuoi dire, devi solo pavimentare () il risultato; piano (5/2) = 2
Joey Sabey,

196

Un'altra opzione è un semplice controllo dei bit.

n & 1

per esempio:

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

1
Questo sarebbe sicuramente il modo più veloce quando si usano numeri interi in un linguaggio come C, con un ampio margine. Qualcuno ha fatto benchmark per determinare se questo è vero anche per PHP?
thomasrutter,

1
È probabilmente il modo più veloce, se il motore PHP fosse ben codificato.
Rolf,

Direi che questo è il modo più veloce e diretto. Perfetto.
Robbiegod,

4
Il link sopra è morto. Ecco un'altra buona spiegazione: catonmat.net/blog/low-level-bit-hacks-you-absolutely-must-know
kasimir

23

Sì utilizzando il mod

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

8

Mentre tutte le risposte sono buone e corrette, una soluzione semplice in una riga è:

$check = 9;

o:

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

o:

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

funziona molto bene.


7
(bool)($number & 1)

o

(bool)(~ $number & 1)

3
Questo è un operatore un po 'convinto, quindi a meno che tu non sappia cosa stai facendo con quella fantasia, eviterei questa sintassi.
danhere

1
Devo ammirare la sintassi, cose che funzionano senza sapere perché, ti danno un promemoria di quanto siamo piccoli nel mondo della fisica, della matematica e, beh, basta aggiungere una riga al numero 1, non a 2 ...
Jonas Lundman

Uso un po 'gli operatori bit per bit in JS. Ad esempio if (~string.indexOf("@")) {}invece di if (string.indexOf("@") !== -1) {}. Preferisco vedere le condizioni comportare un semplice vero o falso. Ma sì, può essere un po 'confuso per le persone che non hanno familiarità con questa sintassi.
Martin James,

7

Un'altra opzione è verificare se l'ultima cifra è un numero pari:

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

O per renderlo più veloce, utilizzare isset()invece di 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
}

O per renderlo più veloce ( battiti mod operatora volte ):

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

Ecco il test del tempo come prova delle mie scoperte.


A Downvoter: posso per favore sapere perché hai effettuato il downvoting?
Subin

4
È molto costoso, rispetto ad altri metodi.
grantwparks,

@grantwparks Bene, la differenza tra l'utilizzo di isset e mod è di soli 0,5007 secondi. Ma array_search è molto costoso.
Sottomissione il

2
@grantwparks Ho aggiornato il codice per includere a volte in_arrayquale operatore di mod batte.
Subin

1
Modo interessante di pensare però. È fondamentalmente la versione decimale di $num & 1:). Potresti anche farlo esadecimale: array (0, 2, 4, 6, 8, A, C, E, F): D.
Matthijs Wessels,

5

Ho fatto un po 'di test e ho scoperto che tra mod is_inte l' &operatore, la mod è la più veloce, seguita da vicino dall'operatore &. is_intè quasi 4 volte più lento del mod.

Ho usato il seguente codice a scopo di 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>";

I risultati che ho ottenuto sono stati abbastanza coerenti. Ecco un esempio:

0.041879177093506 seconds mod
0.15969395637512 seconds is_int
0.044223070144653 seconds & operator

2
sul mio server (5.4.4 / cli / no opcache / i7) "&" è circa il 10% più veloce del mod (testato su array con valori interi casuali)
Pawel Dubiel

3

Tutti i numeri pari divisi per 2 comporteranno un numero intero

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

Zero è un numero pari. In altre parole, la sua parità - la qualità di un numero intero pari o dispari - è pari. Il modo più semplice per dimostrare che zero è pari è verificare che si adatti alla definizione di "pari": è un multiplo intero di 2, in particolare 0 × 2. Di conseguenza, zero condivide tutte le proprietà che caratterizzano i numeri pari: 0 è divisibile per 2, 0 è circondato su entrambi i lati da numeri dispari, 0 è la somma di un numero intero (0) con se stesso e un set di 0 oggetti può essere diviso in due set uguali. da http://en.wikipedia.org/wiki/Parity_of_zero


1
Non capisco. Perché (n + 2)% 2? In quali casi restituisce qualcosa di diverso da n% 2?
Pierre-Olivier Vares,

2

Questo codice controlla se il numero è pari o dispari in PHP. Nell'esempio $aè 2e ottieni un numero pari. Se hai bisogno di dispari, modifica il $avalore

$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 converte automaticamente null e una stringa vuota in zero. Questo succede anche con modulo. Pertanto sarà il codice

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

con valore $ number = '' o $ number = null il risultato è true. Lo testo per un po 'più esteso:

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

Questa funzione restituisce 1 per qualsiasi numero dispari, 0 per qualsiasi numero pari e falso quando non è un numero. Scrivo sempre === vero o === falso per far sapere a me stesso (e agli altri programmatori) che il test è come previsto.


2

Controllare il numero pari o dispari senza condizioni d'uso e istruzione loop.

Questo lavoro per me ..!

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

Sto assumendo che esista già un contatore. in $ i che viene incrementato alla fine di un ciclo, questo funziona per me usando una query abbreviata.

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

Quindi cosa fa questo, beh, la domanda che stiamo facendo in sostanza $ i è dispari, a seconda che sia vero o falso deciderà cosa viene restituito. Il valore restituito popola la nostra variabile $ row_pos

Il mio uso di questo è quello di posizionarlo all'interno del ciclo foreach, proprio prima che ne abbia bisogno, questo lo rende un liner molto efficiente per darmi i nomi delle classi appropriate, questo perché ho già un contatore per l'id da utilizzare più avanti nel programma. Questo è un breve esempio di come userò questa parte.

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

Questo mi dà classi dispari e pari su ogni riga in modo da poter usare la classe corretta e strisciare i miei risultati stampati lungo la pagina.

L'esempio completo di ciò che uso nota che l'id ha il contatore applicato ad esso e alla classe è stato applicato il mio risultato pari / dispari .:

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

in sintesi, questo mi dà un modo molto semplice per creare una bella tabella.


0

Prova questo,

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

0

Avviso, per alcuni motivi, questa condizione non viene valutata come TRUE in una dichiarazione for loop , come mostrato di seguito:

All'inizio di ogni iterazione, expr2viene valutata. Se restituisce TRUE, il ciclo continua e le istruzioni nidificate vengono eseguite. Se restituisce FALSO, l'esecuzione del ciclo termina.


Questo NON funziona:

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

Questo NON funziona:

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

Questo NON funziona:

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

Funziona bene :

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
Cosa aggiunge questa risposta alla risposta inizialmente accettata?
GordonM,

-1

Prova questo con il campo #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.";
    }
    }
?>

3
Cosa aggiunge questa risposta alla risposta inizialmente accettata?
GordonM,

prende input dall'utente e decide su quell'input.
Imran Azim,

Quindi niente davvero.
GordonM,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.