mod ist die allgemeine Abkürzung für 'modulo', auch bekannt als modulare Arithmetik
Marc B
1
Weitere Informationen hier einschließlich: Um ungerade oder gerade zu bestimmen, ist es schneller und effizienter, den bitweisen Operator zu verwenden :&$a=3; if($a&1){echo 'odd';}else{echo 'even';} //returns 'odd'
ashleedawg
Antworten:
557
Du hast zu Recht gedacht, dass Mod ein guter Anfang ist. Hier ist ein Ausdruck, der true zurückgibt, wenn gerade $numberist, false, wenn ungerade:
Wenn Sie dies in Schleifen oder großen Mengen verwenden, sollten Sie den von Arius2038 vorgeschlagenen Bitcheck in Betracht ziehen, der sehr schnell ist. Der Bitcheck ist meine bevorzugte Methode für ungerade / gerade Prüfungen.
Martijn
Funktioniert gut, aber ich frage mich nur, was die Logik dahinter ist. Warum wird bei "10 == 0" der Wert true angegeben?
Snlan
Die Logik ist, dass jede gerade Zahl ohne Rest durch 2 teilbar ist. Wenn Sie $ number% 10 verwendet haben und Ihre $ number 20 war, würde dies true zurückgeben, aber nicht, wenn Ihre $ number 22 wäre. Sie könnten $ number% 10 verwenden, wenn Sie beispielsweise versuchen würden, jedes 10. Element in einer Schleife zu finden .
Crdunst
1
@Tim, wenn 5% 2 = 1. Die Logik ist 2 * 2 + 1 = 5. Wie bekomme ich die 2 in PHP?
Hendry Tanaka
1
@Hendry - was fragst du genau? Wie erhalte ich den Quotienten für eine Division als ganze Zahl oder ...? Wenn Sie das meinen, müssen Sie nur das Ergebnis auf den Boden legen (); Etage (5/2) = 2
Dies wäre definitiv der schnellste Weg, wenn Sie Ganzzahlen in einer Sprache wie C mit großem Abstand verwenden. Hat jemand Benchmarks durchgeführt, um festzustellen, ob dies auch für PHP gilt?
Thomasrutter
1
Es ist wahrscheinlich der schnellste Weg, wenn die PHP-Engine gut codiert war.
Rolf
Ich würde sagen, dies ist der schnellste und direkteste Weg. Perfekt.
Ich glaube, dies ist ein bitweiser Operator. Wenn Sie nicht wissen, was Sie mit dieser Fantasie tun, würde ich diese Syntax vermeiden.
Danhere
1
Ich muss die Syntax bewundern, Dinge, die funktionieren, ohne zu wissen warum, sie erinnern Sie daran, wie klein wir in der Welt der Fysik, Mathematik sind, und fügen Sie einfach eine Zeile zu Nummer 1 hinzu, nicht zu 2 ...
Jonas Lundman
Ich benutze bitweise Operatoren in JS ziemlich oft. Zum Beispiel if (~string.indexOf("@")) {}anstelle von if (string.indexOf("@") !== -1) {}. Ich sehe lieber, dass Bedingungen zu einem einfachen Wahr oder Falsch führen. Aber ja, es kann für Leute, die mit dieser Syntax nicht vertraut sind, etwas verwirrend sein.
Martin James
7
Eine andere Möglichkeit besteht darin, zu überprüfen, ob die letzte Ziffer eine gerade Zahl ist:
$value ="1024";// A Number
$even = array(0,2,4,6,8);if(in_array(substr($value,-1),$even)){// Even Number}else{// Odd Number}
Oder verwenden Sie isset()anstelle von 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}
An Downvoter: Darf ich bitte wissen, warum Sie downvotiert haben?
Subin
4
Es ist sehr teuer im Vergleich zu anderen Methoden.
Grantwparks
@grantwparks Nun, der Unterschied zwischen isset & mod beträgt nur 0,5007 Sekunden. Aber array_search ist sehr teuer.
Subin
2
@grantwparks Ich habe den Code aktualisiert, um einzuschließen, in_arraywelcher Mod-Operator manchmal schlägt.
Subin
1
Interessante Denkweise. Es ist im Grunde die Dezimalversion von $num & 1:). Sie können dies auch hexadezimal tun: Array (0, 2, 4, 6, 8, A, C, E, F): D.
Matthijs Wessels
5
Ich habe ein bisschen getestet und festgestellt, dass zwischen mod is_intund dem &-operator mod am schnellsten ist, dicht gefolgt vom & -operator.
is_intist fast 4 mal langsamer als mod.
Ich habe den folgenden Code zu Testzwecken verwendet:
auf meinem Server (5.4.4 / cli / no opcache / i7) ist das "&" ungefähr 10% schneller als mod (getestet auf einem Array mit zufälligen ganzzahligen Werten)
Pawel Dubiel
3
Alle geraden Zahlen geteilt durch 2 ergeben eine ganze Zahl
//for numbers n [0,1,2,3,4....]if((n+2)%2==1){//odd}else{//even}
Null ist eine gerade Zahl. Mit anderen Worten, seine Parität - die Qualität einer ganzen Zahl, die gerade oder ungerade ist - ist gerade. Der einfachste Weg, um zu beweisen, dass Null gerade ist, besteht darin, zu überprüfen, ob es der Definition von "gerade" entspricht: Es ist ein ganzzahliges Vielfaches von 2, insbesondere 0 × 2. Infolgedessen teilt Null alle Eigenschaften, die gerade Zahlen charakterisieren: 0 ist durch 2 teilbar, 0 ist auf beiden Seiten von ungeraden Zahlen umgeben, 0 ist die Summe einer ganzen Zahl (0) mit sich selbst, und eine Menge von 0 Objekten kann in zwei gleiche Mengen aufgeteilt werden. von http://en.wikipedia.org/wiki/Parity_of_zero
Ich verstehe nicht. Warum (n + 2)% 2? In welchen Fällen wird etwas anderes als n% 2 zurückgegeben?
Pierre-Olivier Vares
2
Dieser Code prüft, ob die Zahl in PHP ungerade oder gerade ist. Im Beispiel $aist 2und Sie erhalten eine gerade Zahl. Wenn Sie ungerade benötigen, ändern Sie den $aWert
$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>";}
PHP konvertiert null und eine leere Zeichenfolge automatisch in eine Null. Das passiert auch mit Modulo. Dafür wird der Code
$number %2==0or!($number &1)
mit dem Wert $ number = '' oder $ number = null ergibt true. Ich teste es dafür etwas länger:
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;}
Diese Funktion gibt 1 für eine ungerade Zahl, 0 für eine gerade Zahl und false zurück, wenn es sich nicht um eine Zahl handelt. Ich schreibe immer === wahr oder === falsch, um mich (und andere Programmierer) wissen zu lassen, dass der Test wie beabsichtigt ist.
<!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>
Ich gehe davon aus, dass bereits ein Zähler vorhanden ist. in $ i, das am Ende einer Schleife inkrementiert wird. Dies funktioniert bei mir mit einer Kurzabfrage.
$row_pos =($i &1)?'odd':'even';
Was macht das also? Nun, es fragt die Aussage ab, die wir im Wesentlichen machen. $ I ist seltsam, je nachdem, ob es wahr oder falsch ist, wird entschieden, was zurückgegeben wird. Der zurückgegebene Wert füllt unsere Variable $ row_pos
Ich verwende dies, um es in der foreach-Schleife zu platzieren, kurz bevor ich es brauche. Dies macht es zu einem sehr effizienten Einzeiler, mir die entsprechenden Klassennamen zu geben. Dies liegt daran, dass ich bereits einen Zähler habe, den die IDs verwenden können später im Programm. Dies ist ein kurzes Beispiel, wie ich diesen Teil verwenden werde.
<divclass='row-{$row_pos}'> random data <div>
Dies gibt mir ungerade und gerade Klassen in jeder Zeile, so dass ich die richtige Klasse verwenden und meine gedruckten Ergebnisse auf der Seite streifen kann.
Das vollständige Beispiel dessen, was ich benutze, ist, dass auf die ID der Zähler angewendet wird und auf die Klasse mein ungerades / gerades Ergebnis angewendet wird:
Warnung: Aus bestimmten Gründen wird diese Bedingung in einer for-Schleifendeklaration nicht als WAHR ausgewertet , wie unten gezeigt:
Zu Beginn jeder Iteration expr2wird ausgewertet. Wenn TRUE ausgewertet wird, wird die Schleife fortgesetzt und die verschachtelten Anweisungen werden ausgeführt. Wenn es als FALSE ausgewertet wird, endet die Ausführung der Schleife.
&
$a=3; if($a&1){echo 'odd';}else{echo 'even';} //returns 'odd'
Antworten:
Du hast zu Recht gedacht, dass Mod ein guter Anfang ist. Hier ist ein Ausdruck, der true zurückgibt, wenn gerade
$number
ist, false, wenn ungerade:Funktioniert für jeden ganzzahligen PHP- Wert, siehe auch Arithmetic Operators PHP .
Beispiel:
Ausgabe:
quelle
Eine weitere Option ist eine einfache Bitprüfung.
beispielsweise:
quelle
Ja mit dem Mod
quelle
Während alle Antworten gut und richtig sind, lautet die einfache Lösung in einer Zeile:
entweder:
oder:
funktioniert sehr gut.
quelle
oder
quelle
if (~string.indexOf("@")) {}
anstelle vonif (string.indexOf("@") !== -1) {}
. Ich sehe lieber, dass Bedingungen zu einem einfachen Wahr oder Falsch führen. Aber ja, es kann für Leute, die mit dieser Syntax nicht vertraut sind, etwas verwirrend sein.Eine andere Möglichkeit besteht darin, zu überprüfen, ob die letzte Ziffer eine gerade Zahl ist:
Oder verwenden Sie
isset()
anstelle vonarray_search
:Oder um es schneller zu machen ( schlägt
mod operator
manchmal ):Hier ist der Zeittest als Beweis für meine Ergebnisse.
quelle
in_array
welcher Mod-Operator manchmal schlägt.$num & 1
:). Sie können dies auch hexadezimal tun: Array (0, 2, 4, 6, 8, A, C, E, F): D.Ich habe ein bisschen getestet und festgestellt, dass zwischen mod
is_int
und dem&
-operator mod am schnellsten ist, dicht gefolgt vom & -operator.is_int
ist fast 4 mal langsamer als mod.Ich habe den folgenden Code zu Testzwecken verwendet:
Die Ergebnisse waren ziemlich konsistent. Hier ist ein Beispiel:
quelle
Alle geraden Zahlen geteilt durch 2 ergeben eine ganze Zahl
quelle
Null ist eine gerade Zahl. Mit anderen Worten, seine Parität - die Qualität einer ganzen Zahl, die gerade oder ungerade ist - ist gerade. Der einfachste Weg, um zu beweisen, dass Null gerade ist, besteht darin, zu überprüfen, ob es der Definition von "gerade" entspricht: Es ist ein ganzzahliges Vielfaches von 2, insbesondere 0 × 2. Infolgedessen teilt Null alle Eigenschaften, die gerade Zahlen charakterisieren: 0 ist durch 2 teilbar, 0 ist auf beiden Seiten von ungeraden Zahlen umgeben, 0 ist die Summe einer ganzen Zahl (0) mit sich selbst, und eine Menge von 0 Objekten kann in zwei gleiche Mengen aufgeteilt werden. von http://en.wikipedia.org/wiki/Parity_of_zero
quelle
Dieser Code prüft, ob die Zahl in PHP ungerade oder gerade ist. Im Beispiel
$a
ist2
und Sie erhalten eine gerade Zahl. Wenn Sie ungerade benötigen, ändern Sie den$a
Wertquelle
PHP konvertiert null und eine leere Zeichenfolge automatisch in eine Null. Das passiert auch mit Modulo. Dafür wird der Code
mit dem Wert $ number = '' oder $ number = null ergibt true. Ich teste es dafür etwas länger:
Diese Funktion gibt 1 für eine ungerade Zahl, 0 für eine gerade Zahl und false zurück, wenn es sich nicht um eine Zahl handelt. Ich schreibe immer === wahr oder === falsch, um mich (und andere Programmierer) wissen zu lassen, dass der Test wie beabsichtigt ist.
quelle
Diese Arbeit für mich ..!
quelle
Ich gehe davon aus, dass bereits ein Zähler vorhanden ist. in $ i, das am Ende einer Schleife inkrementiert wird. Dies funktioniert bei mir mit einer Kurzabfrage.
Was macht das also? Nun, es fragt die Aussage ab, die wir im Wesentlichen machen. $ I ist seltsam, je nachdem, ob es wahr oder falsch ist, wird entschieden, was zurückgegeben wird. Der zurückgegebene Wert füllt unsere Variable $ row_pos
Ich verwende dies, um es in der foreach-Schleife zu platzieren, kurz bevor ich es brauche. Dies macht es zu einem sehr effizienten Einzeiler, mir die entsprechenden Klassennamen zu geben. Dies liegt daran, dass ich bereits einen Zähler habe, den die IDs verwenden können später im Programm. Dies ist ein kurzes Beispiel, wie ich diesen Teil verwenden werde.
Dies gibt mir ungerade und gerade Klassen in jeder Zeile, so dass ich die richtige Klasse verwenden und meine gedruckten Ergebnisse auf der Seite streifen kann.
Das vollständige Beispiel dessen, was ich benutze, ist, dass auf die ID der Zähler angewendet wird und auf die Klasse mein ungerades / gerades Ergebnis angewendet wird:
Zusammenfassend gibt mir dies eine sehr einfache Möglichkeit, eine hübsche Tabelle zu erstellen.
quelle
Versuche dies,
quelle
Warnung: Aus bestimmten Gründen wird diese Bedingung in einer for-Schleifendeklaration nicht als WAHR ausgewertet , wie unten gezeigt:
Dies funktioniert NICHT :
Dies funktioniert NICHT :
Dies funktioniert NICHT :
Das funktioniert OK :
quelle
quelle
quelle
Versuchen Sie dies mit dem Feld #Input
quelle