数が奇数か偶数かをテスト


261

PHPで数値/変数が奇数または偶数であるかどうかを確認する最も簡単な最も基本的な方法は何ですか?それはmodと関係がありますか?

いくつかのスクリプトを試しましたが、現時点ではgoogleが配信されていません。


9
modは「モジュロ」の別名であり、別名モジュラー演算
Marc B

1
詳細情報ここに含めては: 奇数かを決定するために、あるいはそれを使用して、より速く、より効率的ですビット単位の演算子を & $a=3; if($a&1){echo 'odd';}else{echo 'even';} //returns 'odd'
ashleedawg

回答:


557

あなたはmodを始めるのに良い場所だと思っていました。以下は、$number偶数の場合はtrue 、奇数の場合はfalseを返す式です。

$number % 2 == 0

すべての整数PHP値で機能します算術演算子PHPも参照してください。

例:

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

出力:

それは


10
これをループまたは大量に使用する場合は、非常に高速なArius2038によって提案されたビットチェックを検討することをお勧めします。ビットチェックは、奇数/偶数チェックに適した方法です。
Martijn 2013

正常に動作しますが、これの背後にあるロジックは何ですか?「10 == 0」の場合にtrueの値が指定されるのはなぜですか?
snlan 2014

論理は、偶数は2で割り切れ、余りがないことです。$ number%10を使用し、$ numberが20の場合、trueが返されますが、$ numberが22の場合は返されません。たとえば、ループで10番目ごとのアイテムを検索する場合は、$ number%10を使用できます。 。
crdunst 2014

1
@ Tim、5%2 = 1の場合。logicaは2 * 2 + 1 = 5です。phpで2を取得する方法は?
Hendry Tanaka

1
@ヘンドリー-あなたは正確に何を求めていますか?除算の商を整数として取得する方法、または...?それがあなたの意味するところなら、結果をfloor()する必要があるだけです。floor(5/2)= 2
Joey Sabey 2015年

196

別のオプションは、単純なビットチェックです。

n & 1

例えば:

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

1
これは、Cのような言語で整数を使用する場合、大幅に余裕があるので、間違いなく最速の方法です。これがPHPにも当てはまるかどうかを判断するためにベンチマークを行った人はいますか?
thomasrutter 2013

1
PHPエンジンが適切にコーディングされていれば、おそらくこれが最も速い方法です。
Rolf

これが最速かつ最も簡単な方法だと思います。完璧です。
Robbiegod 2014年

4
上記のリンクは死んでいます。別の良い説明があります:catonmat.net/blog/low-level-bit-hacks-you-absolutely-must-know
kasimir


8

すべての答えは適切で正しいですが、1行での簡単な解決策は次のとおりです。

$check = 9;

どちらか:

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

または:

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

とてもうまくいきます。


7
(bool)($number & 1)

または

(bool)(~ $number & 1)

3
これはビットワイズ演算子であると私は信じているので、あなたがその派手さで何をしているのかを知らない限り、私はこの構文を避けます。
danhere 2013

1
構文を理解する必要があります。理由がわからなくても機能し、物理学、数学の世界で私たちがどれほど小さいかを思い出させます。そして、2ではなく1に行を追加します...
Jonas Lundman

私はJSでビット演算子をかなり使用しています。たとえばのif (~string.indexOf("@")) {}代わりにif (string.indexOf("@") !== -1) {}。条件の結果が単純なtrueまたはfalseになることを確認します。しかし、はい、この構文に慣れていない人にとっては少し混乱するかもしれません。
Martin James、

7

別のオプションは、最後の桁が偶数かどうかを確認することです:

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

またはそれをより速くするために、isset()代わりにを使用して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
}

またはそれをより速くするために(時々ビートmod operator):

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

これが私の発見の証拠としての時間テストです。


Downvoterへ:なぜ反対票を投じたのか教えてください。
Subin 2014

4
他の方法と比較して、それは非常に高価です。
grantwparks 2015

@grantwparksさて、issetmodの使用の違いはわずか0.5007秒です。ただし、array_searchは非常に高価です。
Subin 2015

2
@grantwparks in_arraymod演算子に勝るコードを含めるようにコードを更新しました。
2016年

1
しかし、興味深い考え方です。基本的には$num & 1:) の10進数バージョンです。16進数で実行することもできます:array(0、2、4、6、8、A、C、E、F):D。
Matthijs Wessels 2017

5

私は少しテストを行いましたが、mod is_int&-operatorの間で、modが最も速く、&-operatorがそれに続いています。 is_intmodのほぼ4倍の速度です。

テスト目的で次のコードを使用しました。

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

私が得た結果はかなり一貫していた。これがサンプルです:

0.041879177093506 seconds mod
0.15969395637512 seconds is_int
0.044223070144653 seconds & operator

2
私のサーバー(5.4.4 / cli / opcache / i7なし)では、「&」はmodよりも約10%高速です(ランダムな整数値を含む配列でテスト)
Pawel Dubiel

3

2で割ったすべての偶数は整数になります

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

ゼロは偶数です。つまり、そのパリティ(整数の品質が偶数か奇数か)は偶数です。ゼロが偶数であることを証明する最も簡単な方法は、「偶数」の定義に適合することを確認することです。これは、2の整数倍、具体的には0×2です。その結果、ゼロは偶数を特徴付けるすべてのプロパティを共有します:0は2で割り切れます。0は両側が奇数で囲まれ、0は整数(0)との合計であり、0のオブジェクトのセットは2つの等しいセットに分割できます。http://en.wikipedia.org/wiki/Parity_of_zeroから


1
わかりません。なぜ(n + 2)%2ですか?どの場合、n%2とは異なるものを返しますか?
Pierre-Olivier Vares

2

このコードは、PHPで数値が奇数か偶数かをチェックします。例で$a2、偶数を取得します。奇数が必要な場合は、$a値を変更してください

$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と空の文字列を自動的にゼロに変換しています。これはモジュロでも発生します。そのため、コードは

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

値が$ number = ''または$ number = nullの場合、結果はtrueになります。私はそれをやや拡張するためにテストします:

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

この関数は、奇数の場合は1、偶数の場合は0を返し、数値でない場合はfalseを返します。私は常に=== trueまたは=== falseと書いて、テストが意図したとおりであることを自分(および他のプログラマー)に知らせます。


2

使用条件およびループステートメントなしで偶数または奇数をチェックします。

私のためのこの仕事..!

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

私はすでにカウンターが設置されていると仮定しています。ループの最後でインクリメントされる$ iでは、これは簡単なクエリを使用して動作します。

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

つまり、これが何をするかというと、本質的に$ iが作成しているステートメントをクエリします。$ iは、真か偽かによって、何が返されるかを決定します。戻り値は変数$ row_posに入力されます

これの私の使用は、それを必要とする直前にforeachループ内に配置することです。これにより、適切なクラス名を提供するための非常に効率的な1つのライナーが作成されます。これは、IDのカウンターを既に使用しているためです。プログラムの後半。これは、この部分の使用方法の簡単な例です。

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

これにより、各行に奇数と偶数のクラスが与えられるので、正しいクラスを使用して、印刷された結果をページにストライプできます。

私が使用する完全な例では、IDにカウンターが適用され、クラスには奇数/偶数の結果が適用されています。

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

要約すると、これは私にきれいなテーブルを作成する非常に簡単な方法を与えます。



0

警告、いくつかの理由により、以下に示すように、この条件はforループ宣言でTRUEと評価されません。

各反復の始めに、expr2が評価されます。TRUEと評価された場合、ループが続行され、ネストされたステートメントが実行されます。評価がFALSEの場合、ループの実行は終了します。


これは機能しません

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

これは機能しません

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

これは機能しません

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

これは問題なく動作します:

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
この答えは、最初に受け入れられた答えがそうではないことを何に追加しますか?
GordonM

-1

#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
この答えは、最初に受け入れられた答えがそうではないことを何に追加しますか?
GordonM

ユーザーからの入力を受け取り、その入力を決定します。
Imran Azim

本当に何もありません。
GordonM
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.