Teste se o número é ímpar ou par


261

Qual é a maneira mais simples e básica de descobrir se um número / variável é ímpar ou par em PHP? Tem algo a ver com mod?

Eu tentei alguns scripts, mas .. o Google não está entregando no momento.


9
mod é o termo genérico para abreviação de 'modulo', também conhecido como aritmética modular.
Marc B

1
Mais informações aqui incluindo: Para determinar par ou ímpar é mais rápido e mais eficiente usar o bit a bit operador : & $a=3; if($a&1){echo 'odd';}else{echo 'even';} //returns 'odd'
ashleedawg

Respostas:


557

Você estava certo em pensar que o mod era um bom lugar para começar. Aqui está uma expressão que retornará verdadeiro se $numberfor par, falso se for estranho:

$number % 2 == 0

Funciona para todos os valores inteiros do PHP , consulte também Operadores Aritméticos PHP .

Exemplo:

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

Resultado:

É mesmo


10
Se você usar isso em loops ou em grandes quantidades, convém considerar o cadarço sugerido por Arius2038, que é muito rápido. O bitcheck é o meu método preferido para cheques ímpares / pares.
Martijn

Funciona bem, mas eu só estou me perguntando qual é a lógica por trás disso? Por que um valor verdadeiro é dado se "10 == 0"?
snlan

A lógica é que qualquer número par é divisível por 2 sem resto. Se você usasse $ number% 10 e seu número $ fosse 20, ele retornaria verdadeiro, mas não se o seu número $ fosse 22. Você poderia usar $ number% 10 se estivesse tentando encontrar cada décimo item em um loop, por exemplo .
Crdunst 25/09/14

1
@ Tim, se 5% 2 = 1. A lógica é 2 * 2 + 1 = 5.Como obter o 2 em php?
Hendry Tanaka

1
@ Hendry - o que você está perguntando exatamente? Como obter o quociente para uma divisão como um número inteiro ou ...? Se é isso que você quer dizer, você só precisa colocar () o resultado; floor (5/2) = 2
Joey Sabey

196

Outra opção é uma verificação de bits simples.

n & 1

por exemplo:

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

1
Essa seria definitivamente a maneira mais rápida ao usar números inteiros em um idioma como C, por uma grande margem. Alguém já fez benchmarks para determinar se isso também é verdade para PHP?
thomasrutter

1
Provavelmente é a maneira mais rápida, se o mecanismo PHP estiver bem codificado.
Rolf

Eu diria que este é o caminho mais rápido e direto. Perfeito.
Robbiegod 27/03

4
O link acima está morto. Aqui está mais uma boa explicação: catonmat.net/blog/low-level-bit-hacks-you-absolutely-must-know
kasimir

23

Sim usando o mod

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

8

Embora todas as respostas sejam boas e corretas, a solução simples em uma linha é:

$check = 9;

ou:

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

ou:

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

funciona muito bem


7
(bool)($number & 1)

ou

(bool)(~ $number & 1)

3
Acredito que este é um operador bit a bit, a menos que você saiba o que está fazendo com essa fantasia, eu evitaria essa sintaxe.
danhere

1
Eu tenho que admirar a sintaxe, coisas que funcionam sem saber o porquê, lembram como somos pequenos no mundo da física, matemática e, bem, basta adicionar uma linha no número 1, não 2 ...
Jonas Lundman

Eu uso um pouco de operadores bit a bit em JS. Por exemplo, em if (~string.indexOf("@")) {}vez de if (string.indexOf("@") !== -1) {}. Eu prefiro ver as condições resultarem em um simples verdadeiro ou falso. Mas sim, pode ser um pouco confuso para pessoas que não estão familiarizadas com essa sintaxe.
Martin James

7

Outra opção é verificar se o último dígito é um 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
}

Ou para torná-lo mais rápido, use em isset()vez 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 para torná-lo mais rápido ( batidas mod operatoràs vezes ):

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

Aqui está o teste do tempo como prova de minhas descobertas.


Para Downvoter: Posso saber por que você votou negativamente?
Subin

4
É muito caro, comparado a outros métodos.
Concede

@grantwparks Bem, a diferença entre usar isset e mod é de apenas 0,5007 segundos. Mas, array_search é muito caro.
Subin

2
@grantwparks Eu atualizo o código para incluir o in_arrayque bate o operador mod às vezes.
Subin

1
Maneira interessante de pensar embora. É basicamente a versão decimal de $num & 1:). Você também pode fazer isso hexadecimal: array (0, 2, 4, 6, 8, A, C, E, F): D.
Matthijs Wessels

5

Fiz alguns testes e descobri que entre mod is_inte o &operador, o mod é o mais rápido, seguido de perto pelo operador &. is_inté quase 4 vezes mais lento que o mod.

Usei o seguinte código para fins de teste:

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

Os resultados obtidos foram bastante consistentes. Aqui está uma amostra:

0.041879177093506 seconds mod
0.15969395637512 seconds is_int
0.044223070144653 seconds & operator

2
no meu servidor (5.4.4 / cli / não opcache / i7) o "&" é cerca de 10% mais rápido, então mod (testado em conjunto com valores inteiros aleatória)
Pawel Dubiel

3

Todos os números pares divididos por 2 resultarão em um número inteiro

$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 é um número par. Em outras palavras, sua paridade - a qualidade de um número inteiro sendo par ou ímpar - é par. A maneira mais simples de provar que zero é par é verificar se ele se encaixa na definição de "par": é um múltiplo inteiro de 2, especificamente 0 × 2. Como resultado, zero compartilha todas as propriedades que caracterizam os números pares: 0 é divisível por 2, 0 é cercado em ambos os lados por números ímpares, 0 é a soma de um número inteiro (0) consigo mesmo e um conjunto de 0 objetos pode ser dividido em dois conjuntos iguais. de http://en.wikipedia.org/wiki/Parity_of_zero


1
Eu não entendo Por que (n + 2)% 2? Em quais casos ele retorna algo diferente de n% 2?
Pierre-Olivier Vares

2

Este código verifica se o número é ímpar ou par em PHP. No exemplo $aé 2e você obtém o número par. Se você precisar de um $avalor ímpar, altere o valor

$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

O PHP está convertendo nulo e uma string vazia automaticamente para zero. Isso acontece com o módulo também. Portanto, o código

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

com o valor $ number = '' ou $ number = null resultam em true. Eu o testo para algo um pouco mais extenso:

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 função retorna 1 para qualquer número ímpar, 0 para qualquer número par e falso quando não é um número. Eu sempre escrevo === true ou === false para que eu (e outros programadores) saibamos que o teste é o pretendido.


2

Verificar número par ou ímpar sem condição de uso e instrução de loop.

Este trabalho para mim ..!

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

Estou assumindo que já existe um contador. em $ i, que é incrementado no final de um loop, isso funciona para mim usando uma consulta abreviada.

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

Então, o que isso faz, bem, ele consulta a afirmação que estamos fazendo em essência $ i é estranha, dependendo se verdadeiro ou falso irá decidir o que será retornado. O valor retornado preenche nossa variável $ row_pos

Meu uso disso é colocá-lo dentro do loop foreach, logo antes de precisar. Isso torna um liner muito eficiente para me fornecer os nomes de classe apropriados, isso ocorre porque eu já tenho um contador para os IDs usarem. posteriormente no programa. Este é um breve exemplo de como vou usar esta parte.

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

Isso me dá classes ímpares e pares em cada linha, para que eu possa usar a classe correta e distribuir meus resultados impressos pela página.

O exemplo completo do que eu uso, note que o id tem o contador aplicado e a classe tem o meu resultado ímpar / par aplicado a ele:

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

em resumo, isso me dá uma maneira muito simples de criar uma tabela bonita.


0

Tente isso,

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

0

Aviso, por alguns motivos, essa condição não é avaliada como TRUE em uma declaração de loop for , como mostrado abaixo:

No início de cada iteração, expr2é avaliado. Se for avaliado como TRUE, o loop continuará e as instruções aninhadas serão executadas. Se for avaliado como FALSE, a execução do loop será encerrada.


Isso NÃO funciona:

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

Isso NÃO funciona:

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

Isso NÃO funciona:

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

Isso funciona bem :

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
O que essa resposta acrescenta que a resposta originalmente aceita não?
precisa saber é o seguinte

-1

Experimente este com o 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
O que essa resposta acrescenta que a resposta originalmente aceita não?
precisa saber é o seguinte

recebe a entrada do usuário e toma uma decisão sobre essa entrada.
Imran Azim

Então, nada realmente.
precisa saber é o seguinte
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.