Sayının tek mi çift mi olduğunu test edin


261

Bir sayının / değişkenin tek mi yoksa PHP'de mi olduğunu öğrenmenin en basit yolu nedir? Mod ile ilgisi var mı?

Birkaç komut dosyası denedim ama .. google şu anda teslim etmiyor.


9
mod 'modulo', yani modüler aritmetik
Marc B

1
Daha fazla bilgi burada dahil: garip belirlemek için, hatta kullanımı daha hızlı ve daha verimli bitsel operatörünü : & $a=3; if($a&1){echo 'odd';}else{echo 'even';} //returns 'odd'
ashleedawg

Yanıtlar:


557

Modun başlamak için iyi bir yer olduğunu düşünmekte haklıydınız. İşte eğer doğruysa true $number, garipse false döndürecek bir ifade :

$number % 2 == 0

Her tamsayı PHP değeri için çalışır , ayrıca Aritmetik Operatörler PHP'ye bakın .

Misal:

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

Çıktı:

Eşit


10
Bunu döngülerde veya büyük miktarlarda kullanırsanız, çok hızlı olan Arius2038 tarafından önerilen sürtünmeyi düşünmek isteyebilirsiniz. Kaltak, tek / çift çekler için tercih ettiğim yöntem.
Martijn

İyi çalışıyor ama bunun arkasındaki mantığın ne olduğunu merak ediyorum? "10 == 0" ise neden true değeri verilir?
snlan

Mantık, herhangi bir çift sayının geriye kalan 2 ile bölünebilir olmasıdır. $ 10% 10 kullandıysanız ve $ numaranız 20 olursa, true değerini döndürür, ancak $ numaranız 22 olsaydı değil. Döngüdeki her 10. öğeyi bulmaya çalışıyorsanız $ 10% numarasını kullanabilirsiniz. .
crdunst

1
@ Zaman,% 5 2 = 1 ise. Mantık 2 * 2 + 1 = 5'dir. Php 2 nasıl alınır?
Hendry Tanaka

1
@Hendry - tam olarak ne soruyorsun? Bir tamsayı olarak bölünme bölümü nasıl elde edilir veya ...? Demek istediğin buysa, sonucu () katlaman yeterli; kat (5/2) = 2
Joey Sabey

196

Başka bir seçenek de basit bir bit kontrolüdür.

n & 1

Örneğin:

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

1
Bu, C gibi bir dilde tamsayıları büyük bir farkla kullanırken kesinlikle en hızlı yol olacaktır. Herkes bunun PHP için de geçerli olup olmadığını belirlemek için kriterler yaptı mı?
thomasrutter

1
PHP motoru iyi kodlanmışsa, muhtemelen en hızlı yol budur.
Rolf

Bunun en hızlı ve en basit yol olduğunu söyleyebilirim. Mükemmel.
Robbiegod

4
Yukarıdaki bağlantı öldü. İşte başka bir iyi açıklama: catonmat.net/blog/low-level-bit-hacks-you-absolutely-must-know
kasimir

23

Evet modunu kullanarak

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

8

Tüm cevaplar iyi ve doğru olsa da, bir satırdaki basit çözüm:

$check = 9;

ya:

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

veya:

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

çok iyi çalışıyor.


7
(bool)($number & 1)

veya

(bool)(~ $number & 1)

3
Bu bitsel bir operatör, bu fanteziyle ne yaptığınızı bilmediğiniz sürece, bu sözdiziminden kaçınırım.
danhere

1
Sözdizimine, nedenini bilmeden işe yarayan şeylere hayran kalmalıyım, size fisik, matematik dünyasında ne kadar küçük olduğumuzu hatırlatır ve sadece 2 numaralı değil, 1 numaralı bir satır eklerim ...
Jonas Lundman

Ben JS biraz bit operatörleri kullanın. Örneğin, if (~string.indexOf("@")) {}yerine if (string.indexOf("@") !== -1) {}. Koşulların basit bir doğru veya yanlışla sonuçlanmasını tercih ederim. Ancak evet, bu sözdizimine aşina olmayan insanlar için biraz kafa karıştırıcı olabilir.
Martin James

7

Başka bir seçenek, son basamağın çift sayı olup olmadığını kontrol etmektir:

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

Ya da daha hızlı, kullanımı yapmak isset()yerine 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
}

Veya daha hızlı yapmak için ( zaman zaman vuruşlarmod operator ):

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

İşte bulgularıma kanıt olarak zaman testi .


Downvoter'a: Lütfen neden aşağı indirdiğinizi öğrenebilir miyim?
Subin

4
Diğer yöntemlere kıyasla çok pahalı.
grantwparks

@grantwparks Eh, isset & mod kullanımı arasındaki fark sadece 0.5007 saniyedir. Ancak, dizi_search çok pahalıdır.
Subin

2
@grantwparks Ben in_arraybazen mod operatörü yener dahil kodu güncelledik .
Subin

1
İlginç bir düşünce tarzı olsa. Temelde $num & 1:) ondalık sürümüdür . Ayrıca onaltılık yapabilirsiniz: dizi (0, 2, 4, 6, 8, A, C, E, F): D.
Matthijs Wessels

5

Biraz test yaptım ve mod is_intile &-operator arasında modun en hızlı olduğunu gördüm, bunu & -operator izledi. is_intmoddan yaklaşık 4 kat daha yavaştır.

Test amacıyla aşağıdaki kodu kullandım:

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

Aldığım sonuçlar oldukça tutarlıydı. İşte bir örnek:

0.041879177093506 seconds mod
0.15969395637512 seconds is_int
0.044223070144653 seconds & operator

2
Benim sunucuda (5.4.4 / cli / hayır opcache / i7) "&" % 10 daha hızlı daha sonra mod (rastgele tamsayı değerleri ile dizisinde test) hakkındadır
Pawel Dubiel

3

2'ye bölünen tüm çift sayılar bir tamsayı ile sonuçlanır

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

Sıfır, çift sayıdır. Başka bir deyişle, paritesi - bir tamsayının çift veya tek olma kalitesi - çifttir. Sıfırın eşit olduğunu kanıtlamanın en basit yolu, "çift" tanımına uyup uymadığını kontrol etmektir: 2'nin tam sayı katı, özellikle 0 × 2'dir. Sonuç olarak, sıfır, çift sayıları karakterize eden tüm özellikleri paylaşır: 0 2 ile bölünebilir, 0 her iki tarafta tek sayılarla çevrilidir, 0 kendisiyle bir tamsayının (0) toplamıdır ve 0 nesne kümesi iki eşit kümeye bölünebilir. dan http://en.wikipedia.org/wiki/Parity_of_zero


1
Anlamıyorum. Neden (n + 2)% 2? Hangi durumlarda n% 2'den farklı bir şey döndürür?
Pierre-Olivier Vares

2

Bu kod, numaranın tek veya çift PHP olup olmadığını kontrol eder. Örnekte $aolduğu 2ve hatta sayı olsun. Eğer tuhaflığa ihtiyacınız varsa $adeğeri değiştirin

$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 null ve boş bir dizeyi otomatik olarak sıfıra dönüştürür. Bu modulo ile de olur. Bu nedenle kod

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

$ number = '' veya $ number = null sonuç true ile. Ben biraz daha genişletilmiş test:

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

Bu işlev herhangi bir tek sayı için 1, çift sayı için 0 ve sayı olmadığında false döndürür. Kendime (ve diğer programcılara) testin amaçlandığı gibi olduğunu bildirmek için her zaman === true veya === false yazarım.


2

Kullanım Koşulları ve Döngü Bildirimi Olmadan Çift veya Tek Numarayı Kontrol Edin.

Bu iş benim için ..!

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

Halihazırda bir sayaç bulunduğunu varsayıyorum. $ i bir döngü sonunda artırılır, Bu benim için bir steno sorgu kullanarak çalışır.

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

Peki bu ne yapar, iyi ya da yanlış ne döndürür karar verecek bağlı olarak $ i tuhaf özünde yaptığımız ifade sorgular. Döndürülen değer $ row_pos değişkenimizi doldurur

Bunu kullanmam, foreach döngüsünün içine yerleştirmem gerekiyor, buna ihtiyaç duymadan hemen önce, bu bana uygun sınıf isimlerini vermek için çok verimli bir astar yapar, çünkü zaten kimliklerin kullanması için bir sayacım var daha sonra programda. Bu, bu kısmı nasıl kullanacağımın kısa bir örneğidir.

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

Bu bana doğru sınıfı kullanmak ve yazdırılan sonuçları sayfa aşağı şerit böylece her satırda garip ve hatta sınıflar verir.

Ne kullandığım tam örnek kimliği kimliği sayacı uygulanmış ve sınıf benim uygulanan tek / çift sonuç vardır .:

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

özetle, bu bana güzel bir tablo oluşturmak için çok basit bir yol sağlar.


0

Bunu dene,

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

0

Uyarı, bazı nedenlerden dolayı, bu koşul, aşağıda gösterildiği gibi bir döngü bildiriminde TRUE olarak değerlendirilmez :

Her yinelemenin başında expr2, değerlendirilir. TRUE olarak değerlendirilirse, döngü devam eder ve iç içe ifadeler yürütülür. YANLIŞ olarak değerlendirilirse, döngünün yürütülmesi sona erer.


Bu mu DEĞİL çalışır:

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

Bu mu DEĞİL çalışır:

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

Bu mu DEĞİL çalışır:

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

Bu işleri Tamam :

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
Bu cevap ilk başta kabul edilen cevabın eklenmediğini ne ekliyor?
GordonM

-1

#Input alanı ile bunu deneyin

<?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
Bu cevap ilk başta kabul edilen cevabın eklenmediğini ne ekliyor?
GordonM

kullanıcıdan girdi alır ve bu girdi hakkında karar alır.
Imran Azim

Yani gerçekten hiçbir şey.
GordonM
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.