Prueba si el número es par o impar

262

¿Cuál es la forma más simple y básica de averiguar si un número / variable es impar o par en PHP? ¿Tiene algo que ver con el mod?

He probado algunos scripts pero ... google no se está entregando en este momento.

usuario1022585
fuente
9
mod es el término genérico abreviado para 'módulo', también conocido como aritmética modular
Marc B
1
Más información aquí incluyendo: Para determinar impar o par, es más rápido y más eficiente usar el operador bit a bit : & $a=3; if($a&1){echo 'odd';}else{echo 'even';} //returns 'odd'
ashleedawg

Respuestas:

558

Tenías razón al pensar que el mod era un buen lugar para comenzar. Aquí hay una expresión que devolverá verdadero si $numberes par, falso si impar:

$number % 2 == 0

Funciona para cada valor entero de PHP , vea también Operadores aritméticos PHP .

Ejemplo:

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

Salida:

Es incluso

Tim Cooper
fuente
10
Si usa esto en bucles o grandes cantidades, es posible que desee considerar la comprobación de bits sugerida por Arius2038, que es muy rápida. El bitcheck es mi método preferido para verificaciones pares / impares.
Martijn
Funciona bien, pero me pregunto cuál es la lógica detrás de esto. ¿Por qué se da un valor verdadero si "10 == 0"?
snlan
La lógica es que cualquier número par es divisible por 2 sin resto. Si usó $ number% 10, y su $ number era 20, devolvería verdadero, pero no si su $ number era 22. Podría usar $ number% 10 si intentaba encontrar cada décimo elemento en un bucle, por ejemplo .
Crdunst
1
@Tim, si 5% 2 = 1. La lógica es 2 * 2 + 1 = 5. ¿Cómo obtener el 2 en php?
Hendry Tanaka
1
@Hendry: ¿qué preguntas exactamente? ¿Cómo obtener el cociente para una división como un número entero, o ...? Si eso es lo que quieres decir, solo necesitas poner el resultado (); piso (5/2) = 2
Joey Sabey
196

Otra opción es una simple comprobación de bits.

n & 1

por ejemplo:

if ( $num & 1 ) {
  //odd
} else {
  //even
}
Pawel Dubiel
fuente
1
Definitivamente, esta sería la forma más rápida cuando se usan enteros en un lenguaje como C, por un amplio margen. ¿Alguien ha hecho puntos de referencia para determinar si esto también es cierto para PHP?
thomasrutter
1
Probablemente sea la forma más rápida, si el motor PHP estaba bien codificado.
Rolf
Yo diría que esta es la forma más rápida y directa. Perfecto.
Robbiegod
44
El enlace de arriba está muerto. Aquí hay otra buena explicación: catonmat.net/blog/low-level-bit-hacks-you-absolutely-must-know
kasimir
23

Si usando el mod

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

Si bien todas las respuestas son buenas y correctas, la solución simple en una línea es:

$check = 9;

ya sea:

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

o:

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

funciona muy bien

Tarik
fuente
7
(bool)($number & 1)

o

(bool)(~ $number & 1)
Olegs
fuente
3
Creo que es un operador bit a bit, a menos que sepa lo que está haciendo con esa fantasía, evitaría esta sintaxis.
danhere
1
Tengo que admirar la sintaxis, las cosas que funcionan sin saber por qué, te recuerdan lo pequeños que somos en el mundo de la física, las matemáticas y, bueno, solo agrega una fila en el número 1, no en el 2 ...
Jonas Lundman
Utilizo bastante operadores bit a bit en JS. Por ejemplo en if (~string.indexOf("@")) {}lugar de if (string.indexOf("@") !== -1) {}. Prefiero ver que las condiciones den como resultado un simple verdadero o falso. Pero sí, puede ser un poco confuso para las personas que no están familiarizadas con esta sintaxis.
Martin James
7

Otra opción es verificar si el último dígito es un número par:

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

O para hacerlo más rápido, use en isset()lugar 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
}

O para hacerlo más rápido ( latidos mod operatora veces ):

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

Aquí está la prueba de tiempo como prueba de mis hallazgos.

Subin
fuente
A Downvoter: ¿Puedo saber por qué votaron en contra?
Subin
44
Es muy caro, en comparación con otros métodos.
grantwparks
@grantwparks Bueno, la diferencia entre usar isset y mod es de solo 0.5007 segundos. Pero, array_search es muy costoso.
Subin
2
@grantwparks He actualizado el código para incluir in_arrayqué operador de mod late a veces.
Subin
1
Interesante forma de pensar sin embargo. Básicamente es la versión decimal de $num & 1:). También puede hacerlo hexadecimal: array (0, 2, 4, 6, 8, A, C, E, F): D.
Matthijs Wessels
5

Hice un poco de prueba, y descubrí que entre mod is_inty &-operator, mod es el más rápido, seguido de cerca por & -operator. is_intes casi 4 veces más lento que el mod.

Usé el siguiente código para fines de prueba:

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

Los resultados que obtuve fueron bastante consistentes. Aquí hay una muestra:

0.041879177093506 seconds mod
0.15969395637512 seconds is_int
0.044223070144653 seconds & operator
Ruben Coolen
fuente
2
en mi servidor (5.4.4 / cli / no opcache / i7) el "&" es aproximadamente un 10% más rápido que el mod (probado en una matriz con valores enteros aleatorios)
Pawel Dubiel
3

Todos los números pares divididos por 2 darán como resultado un número entero

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

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

Cero es un número par. En otras palabras, su paridad, la calidad de un número entero par o impar, es par. La forma más simple de demostrar que cero es par es comprobar que se ajusta a la definición de "par": es un múltiplo entero de 2, específicamente 0 × 2. Como resultado, cero comparte todas las propiedades que caracterizan los números pares: 0 es divisible por 2, 0 está rodeado en ambos lados por números impares, 0 es la suma de un entero (0) consigo mismo, y un conjunto de 0 objetos se puede dividir en dos conjuntos iguales. de http://en.wikipedia.org/wiki/Parity_of_zero

sumitir
fuente
1
No entiendo. ¿Por qué (n + 2)% 2? ¿En qué casos devuelve algo diferente de n% 2?
Pierre-Olivier Vares
2

Este código verifica si el número es impar o par en PHP. En el ejemplo $aes 2y obtienes un número par. Si necesita impar, cambie el $avalor

$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
fuente
2

PHP está convirtiendo nulo y una cadena vacía automáticamente a cero. Eso también sucede con el módulo. Por lo tanto, el código

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

con valor $ número = '' o $ número = resultado nulo en verdadero. Lo pruebo para ello algo más extendido:

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

Esta función devuelve 1 para cualquier número impar, 0 para cualquier número par y falso cuando no es un número. Siempre escribo === verdadero o === falso para que yo (y otros programadores) sepan que la prueba es como se esperaba.

Loek Bergman
fuente
2

Verifique el número par o impar sin condición de uso y la declaración de bucle.

Este trabajo para mi ..!

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

Estoy asumiendo que ya hay un contador en su lugar. en $ i que se incrementa al final de un ciclo, esto funciona para mí usando una consulta abreviada.

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

Entonces, ¿qué hace esto? Bueno, consulta la afirmación que estamos haciendo, en esencia, $ i es impar, dependiendo de si es verdadero o falso decidirá qué se devuelve. El valor devuelto llena nuestra variable $ row_pos

Mi uso de esto es colocarlo dentro del bucle foreach, justo antes de que lo necesite. Esto hace que sea un revestimiento muy eficiente para darme los nombres de clase apropiados, esto se debe a que ya tengo un contador para que los id usen luego en el programa. Este es un breve ejemplo de cómo usaré esta parte.

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

Esto me da clases pares e impares en cada fila para que pueda usar la clase correcta y eliminar mis resultados impresos en la página.

El ejemplo completo de lo que uso nota que la identificación tiene el contador aplicado y la clase tiene mi resultado impar / par aplicado:

$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 resumen, esto me da una forma muy simple de crear una bonita mesa.

Chris
fuente
0

Prueba esto,

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

Advertencia, por algunas razones, esta condición no se evalúa como VERDADERA en una declaración de bucle for , como se muestra a continuación:

Al comienzo de cada iteración, expr2se evalúa. Si se evalúa como VERDADERO, el ciclo continúa y se ejecutan las declaraciones anidadas. Si se evalúa como FALSO, la ejecución del ciclo finaliza.


Esto NO funciona:

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

Esto NO funciona:

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

Esto NO funciona:

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

Esto funciona bien :

for ($i=0; $i<count($str); $i++){
  if ($i % 2 === 1) {
    // echo "-----------\n";
  }
}
NVRM
fuente
-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';
usuario2610558
fuente
-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
fuente
1
¿Qué agrega esta respuesta que la respuesta originalmente aceptada no?
GordonM
-1

Pruebe este con el 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.";
    }
    }
?>
Imran Azim
fuente
3
¿Qué agrega esta respuesta que la respuesta originalmente aceptada no?
GordonM
toma entrada del usuario y toma una decisión sobre esa entrada.
Imran Azim
Entonces nada realmente.
GordonM