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.

user1022585
fonte
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

Tim Cooper
fonte
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
}
Pawel Dubiel
fonte
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);
Aaron W.
fonte
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

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

ou

(bool)(~ $number & 1)
Olegs
fonte
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.

Subin
fonte
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
Ruben Coolen
fonte
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");
}
David S.
fonte
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

sumit
fonte
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>";
}
Narendra Chauhan
fonte
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.

Loek Bergman
fonte
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>

jd savaj
fonte
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.

Chris
fonte
0

Tente isso,

$number = 10;
 switch ($number%2)
 {
 case 0:
 echo "It's even";
 break;
 default:
 echo "It's odd";
 }
Sajjad Hossain
fonte
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";
  }
}
NVRM
fonte
-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
fonte
-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
fonte
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.";
    }
    }
?>
Imran Azim
fonte
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