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:
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
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.
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}
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.
//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
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>";}
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==0or!($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>";}}Theprintis there for testing purposes, hence in practice it becomes:function testEven($pArg){if(is_int($pArg)===true){return $pArg%2;}returnfalse;}
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.
<!DOCTYPE html><html><head><scriptsrc="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><inputtype="text"name="num_even_odd"id="num_even_odd"placeholder="Enter Only Number"></td></tr><tr><th>Your Answer Is :</th><tdid="ans_even_odd"style="font-size:15px;color:gray;font-weight:900;"></td></tr><tr><td><inputtype="button"name="btn_even_odd"id="btn_even_odd"value="submit"></td></tr></table></body></html>
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.
<divclass='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:
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.
&
$a=3; if($a&1){echo 'odd';}else{echo 'even';} //returns 'odd'
Respostas:
Você estava certo em pensar que o mod era um bom lugar para começar. Aqui está uma expressão que retornará verdadeiro se
$number
for par, falso se for estranho:Funciona para todos os valores inteiros do PHP , consulte também Operadores Aritméticos PHP .
Exemplo:
Resultado:
fonte
Outra opção é uma verificação de bits simples.
por exemplo:
fonte
Sim usando o mod
fonte
Embora todas as respostas sejam boas e corretas, a solução simples em uma linha é:
ou:
ou:
funciona muito bem
fonte
ou
fonte
if (~string.indexOf("@")) {}
vez deif (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.Outra opção é verificar se o último dígito é um número par:
Ou para torná-lo mais rápido, use em
isset()
vez dearray_search
:Ou para torná-lo mais rápido ( batidas
mod operator
às vezes ):Aqui está o teste do tempo como prova de minhas descobertas.
fonte
in_array
que bate o operador mod às vezes.$num & 1
:). Você também pode fazer isso hexadecimal: array (0, 2, 4, 6, 8, A, C, E, F): D.Fiz alguns testes e descobri que entre mod
is_int
e 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:
Os resultados obtidos foram bastante consistentes. Aqui está uma amostra:
fonte
Todos os números pares divididos por 2 resultarão em um número inteiro
fonte
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
fonte
Este código verifica se o número é ímpar ou par em PHP. No exemplo
$a
é2
e você obtém o número par. Se você precisar de um$a
valor ímpar, altere o valorfonte
O PHP está convertendo nulo e uma string vazia automaticamente para zero. Isso acontece com o módulo também. Portanto, o código
com o valor $ number = '' ou $ number = null resultam em true. Eu o testo para algo um pouco mais extenso:
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.
fonte
Este trabalho para mim ..!
fonte
Estou assumindo que já existe um contador. em $ i, que é incrementado no final de um loop, isso funciona para mim usando uma consulta abreviada.
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.
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:
em resumo, isso me dá uma maneira muito simples de criar uma tabela bonita.
fonte
Tente isso,
fonte
Aviso, por alguns motivos, essa condição não é avaliada como TRUE em uma declaração de loop for , como mostrado abaixo:
Isso NÃO funciona:
Isso NÃO funciona:
Isso NÃO funciona:
Isso funciona bem :
fonte
fonte
fonte
Experimente este com o campo #Input
fonte