<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> <title>Comparison Operators</title> </head> <body><div class="manualnavbar" style="text-align: center;"> <div class="prev" style="text-align: left; float: left;"><a href="language.operators.bitwise.html">Bitwise Operators</a></div> <div class="next" style="text-align: right; float: right;"><a href="language.operators.errorcontrol.html">Error Control Operators</a></div> <div class="up"><a href="language.operators.html">Operators</a></div> <div class="home"><a href="index.html">PHP Manual</a></div> </div><hr /><div id="language.operators.comparison" class="sect1"> <h2 class="title">Comparison Operators</h2> <p class="simpara"> Comparison operators, as their name implies, allow you to compare two values. You may also be interested in viewing <a href="types.comparisons.html" class="link">the type comparison tables</a>, as they show examples of various type related comparisons. </p> <table class="doctable table"> <caption><strong>Comparison Operators</strong></caption> <thead> <tr> <th>Example</th> <th>Name</th> <th>Result</th> </tr> </thead> <tbody class="tbody"> <tr> <td>$a == $b</td> <td>Equal</td> <td><strong><code>TRUE</code></strong> if <var class="varname"><var class="varname">$a</var></var> is equal to <var class="varname"><var class="varname">$b</var></var> after type juggling.</td> </tr> <tr> <td>$a === $b</td> <td>Identical</td> <td> <strong><code>TRUE</code></strong> if <var class="varname"><var class="varname">$a</var></var> is equal to <var class="varname"><var class="varname">$b</var></var>, and they are of the same type. </td> </tr> <tr> <td>$a != $b</td> <td>Not equal</td> <td><strong><code>TRUE</code></strong> if <var class="varname"><var class="varname">$a</var></var> is not equal to <var class="varname"><var class="varname">$b</var></var> after type juggling.</td> </tr> <tr> <td>$a <> $b</td> <td>Not equal</td> <td><strong><code>TRUE</code></strong> if <var class="varname"><var class="varname">$a</var></var> is not equal to <var class="varname"><var class="varname">$b</var></var> after type juggling.</td> </tr> <tr> <td>$a !== $b</td> <td>Not identical</td> <td> <strong><code>TRUE</code></strong> if <var class="varname"><var class="varname">$a</var></var> is not equal to <var class="varname"><var class="varname">$b</var></var>, or they are not of the same type. </td> </tr> <tr> <td>$a < $b</td> <td>Less than</td> <td><strong><code>TRUE</code></strong> if <var class="varname"><var class="varname">$a</var></var> is strictly less than <var class="varname"><var class="varname">$b</var></var>.</td> </tr> <tr> <td>$a > $b</td> <td>Greater than</td> <td><strong><code>TRUE</code></strong> if <var class="varname"><var class="varname">$a</var></var> is strictly greater than <var class="varname"><var class="varname">$b</var></var>.</td> </tr> <tr> <td>$a <= $b</td> <td>Less than or equal to </td> <td><strong><code>TRUE</code></strong> if <var class="varname"><var class="varname">$a</var></var> is less than or equal to <var class="varname"><var class="varname">$b</var></var>.</td> </tr> <tr> <td>$a >= $b</td> <td>Greater than or equal to </td> <td><strong><code>TRUE</code></strong> if <var class="varname"><var class="varname">$a</var></var> is greater than or equal to <var class="varname"><var class="varname">$b</var></var>.</td> </tr> </tbody> </table> <p class="para"> If you compare a number with a string or the comparison involves numerical strings, then each string is <a href="language.types.string.html#language.types.string.conversion" class="link">converted to a number</a> and the comparison performed numerically. These rules also apply to the <a href="control-structures.switch.html" class="link">switch</a> statement. The type conversion does not take place when the comparison is === or !== as this involves comparing the type as well as the value. <div class="informalexample"> <div class="example-contents"> <div class="phpcode"><code><span style="color: #000000"> <span style="color: #0000BB"><?php<br />var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">0 </span><span style="color: #007700">== </span><span style="color: #DD0000">"a"</span><span style="color: #007700">); </span><span style="color: #FF8000">// 0 == 0 -> true<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #DD0000">"1" </span><span style="color: #007700">== </span><span style="color: #DD0000">"01"</span><span style="color: #007700">); </span><span style="color: #FF8000">// 1 == 1 -> true<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #DD0000">"10" </span><span style="color: #007700">== </span><span style="color: #DD0000">"1e1"</span><span style="color: #007700">); </span><span style="color: #FF8000">// 10 == 10 -> true<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">100 </span><span style="color: #007700">== </span><span style="color: #DD0000">"1e2"</span><span style="color: #007700">); </span><span style="color: #FF8000">// 100 == 100 -> true<br /><br /></span><span style="color: #007700">switch (</span><span style="color: #DD0000">"a"</span><span style="color: #007700">) {<br />case </span><span style="color: #0000BB">0</span><span style="color: #007700">:<br /> echo </span><span style="color: #DD0000">"0"</span><span style="color: #007700">;<br /> break;<br />case </span><span style="color: #DD0000">"a"</span><span style="color: #007700">: </span><span style="color: #FF8000">// never reached because "a" is already matched with 0<br /> </span><span style="color: #007700">echo </span><span style="color: #DD0000">"a"</span><span style="color: #007700">;<br /> break;<br />}<br /></span><span style="color: #0000BB">?></span> </span> </code></div> </div> </div> </p> <p class="para"> For various types, comparison is done according to the following table (in order). </p> <table id="language.operators.comparison.types" class="doctable table"> <caption><strong>Comparison with Various Types</strong></caption> <thead> <tr> <th>Type of Operand 1</th> <th>Type of Operand 2</th> <th>Result</th> </tr> </thead> <tbody class="tbody"> <tr> <td><span class="type"><a href="language.types.null.html" class="type null">null</a></span> or <span class="type"><a href="language.types.string.html" class="type string">string</a></span></td> <td><span class="type"><a href="language.types.string.html" class="type string">string</a></span></td> <td>Convert <strong><code>NULL</code></strong> to "", numerical or lexical comparison</td> </tr> <tr> <td><span class="type"><a href="language.types.boolean.html" class="type bool">bool</a></span> or <span class="type"><a href="language.types.null.html" class="type null">null</a></span></td> <td>anything</td> <td>Convert both sides to <span class="type"><a href="language.types.boolean.html" class="type bool">bool</a></span>, <strong><code>FALSE</code></strong> < <strong><code>TRUE</code></strong></td> </tr> <tr> <td><span class="type"><a href="language.types.object.html" class="type object">object</a></span></td> <td><span class="type"><a href="language.types.object.html" class="type object">object</a></span></td> <td>Built-in classes can define its own comparison, different classes are uncomparable, same class - compare properties the same way as arrays (PHP 4), PHP 5 has its own <a href="language.oop5.object-comparison.html" class="link">explanation</a> </td> </tr> <tr> <td><span class="type"><a href="language.types.string.html" class="type string">string</a></span>, <span class="type"><a href="language.types.resource.html" class="type resource">resource</a></span> or <span class="type"><a href="language.pseudo-types.html#language.types.number" class="type number">number</a></span></td> <td><span class="type"><a href="language.types.string.html" class="type string">string</a></span>, <span class="type"><a href="language.types.resource.html" class="type resource">resource</a></span> or <span class="type"><a href="language.pseudo-types.html#language.types.number" class="type number">number</a></span></td> <td>Translate strings and resources to numbers, usual math</td> </tr> <tr> <td><span class="type"><a href="language.types.array.html" class="type array">array</a></span></td> <td><span class="type"><a href="language.types.array.html" class="type array">array</a></span></td> <td>Array with fewer members is smaller, if key from operand 1 is not found in operand 2 then arrays are uncomparable, otherwise - compare value by value (see following example)</td> </tr> <tr> <td><span class="type"><a href="language.types.object.html" class="type object">object</a></span></td> <td>anything</td> <td><span class="type"><a href="language.types.object.html" class="type object">object</a></span> is always greater</td> </tr> <tr> <td><span class="type"><a href="language.types.array.html" class="type array">array</a></span></td> <td>anything</td> <td><span class="type"><a href="language.types.array.html" class="type array">array</a></span> is always greater</td> </tr> </tbody> </table> <p class="para"> <div class="example" id="example-121"> <p><strong>Example #1 Boolean/null comparison</strong></p> <div class="example-contents"> <div class="phpcode"><code><span style="color: #000000"> <span style="color: #0000BB"><?php<br /></span><span style="color: #FF8000">// Bool and null are compared as bool always<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">1 </span><span style="color: #007700">== </span><span style="color: #0000BB">TRUE</span><span style="color: #007700">); </span><span style="color: #FF8000">// TRUE - same as (bool)1 == TRUE<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">0 </span><span style="color: #007700">== </span><span style="color: #0000BB">FALSE</span><span style="color: #007700">); </span><span style="color: #FF8000">// TRUE - same as (bool)0 == FALSE<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">100 </span><span style="color: #007700">< </span><span style="color: #0000BB">TRUE</span><span style="color: #007700">); </span><span style="color: #FF8000">// FALSE - same as (bool)100 < TRUE<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(-</span><span style="color: #0000BB">10 </span><span style="color: #007700">< </span><span style="color: #0000BB">FALSE</span><span style="color: #007700">);</span><span style="color: #FF8000">// FALSE - same as (bool)-10 < FALSE<br /></span><span style="color: #0000BB">var_dump</span><span style="color: #007700">(</span><span style="color: #0000BB">min</span><span style="color: #007700">(-</span><span style="color: #0000BB">100</span><span style="color: #007700">, -</span><span style="color: #0000BB">10</span><span style="color: #007700">, </span><span style="color: #0000BB">NULL</span><span style="color: #007700">, </span><span style="color: #0000BB">10</span><span style="color: #007700">, </span><span style="color: #0000BB">100</span><span style="color: #007700">)); </span><span style="color: #FF8000">// NULL - (bool)NULL < (bool)-100 is FALSE < TRUE<br /></span><span style="color: #0000BB">?></span> </span> </code></div> </div> </div> </p> <p class="para"> <div class="example" id="example-122"> <p><strong>Example #2 Transcription of standard array comparison</strong></p> <div class="example-contents"> <div class="phpcode"><code><span style="color: #000000"> <span style="color: #0000BB"><?php<br /></span><span style="color: #FF8000">// Arrays are compared like this with standard comparison operators<br /></span><span style="color: #007700">function </span><span style="color: #0000BB">standard_array_compare</span><span style="color: #007700">(</span><span style="color: #0000BB">$op1</span><span style="color: #007700">, </span><span style="color: #0000BB">$op2</span><span style="color: #007700">)<br />{<br /> if (</span><span style="color: #0000BB">count</span><span style="color: #007700">(</span><span style="color: #0000BB">$op1</span><span style="color: #007700">) < </span><span style="color: #0000BB">count</span><span style="color: #007700">(</span><span style="color: #0000BB">$op2</span><span style="color: #007700">)) {<br /> return -</span><span style="color: #0000BB">1</span><span style="color: #007700">; </span><span style="color: #FF8000">// $op1 < $op2<br /> </span><span style="color: #007700">} elseif (</span><span style="color: #0000BB">count</span><span style="color: #007700">(</span><span style="color: #0000BB">$op1</span><span style="color: #007700">) > </span><span style="color: #0000BB">count</span><span style="color: #007700">(</span><span style="color: #0000BB">$op2</span><span style="color: #007700">)) {<br /> return </span><span style="color: #0000BB">1</span><span style="color: #007700">; </span><span style="color: #FF8000">// $op1 > $op2<br /> </span><span style="color: #007700">}<br /> foreach (</span><span style="color: #0000BB">$op1 </span><span style="color: #007700">as </span><span style="color: #0000BB">$key </span><span style="color: #007700">=> </span><span style="color: #0000BB">$val</span><span style="color: #007700">) {<br /> if (!</span><span style="color: #0000BB">array_key_exists</span><span style="color: #007700">(</span><span style="color: #0000BB">$key</span><span style="color: #007700">, </span><span style="color: #0000BB">$op2</span><span style="color: #007700">)) {<br /> return </span><span style="color: #0000BB">null</span><span style="color: #007700">; </span><span style="color: #FF8000">// uncomparable<br /> </span><span style="color: #007700">} elseif (</span><span style="color: #0000BB">$val </span><span style="color: #007700">< </span><span style="color: #0000BB">$op2</span><span style="color: #007700">[</span><span style="color: #0000BB">$key</span><span style="color: #007700">]) {<br /> return -</span><span style="color: #0000BB">1</span><span style="color: #007700">;<br /> } elseif (</span><span style="color: #0000BB">$val </span><span style="color: #007700">> </span><span style="color: #0000BB">$op2</span><span style="color: #007700">[</span><span style="color: #0000BB">$key</span><span style="color: #007700">]) {<br /> return </span><span style="color: #0000BB">1</span><span style="color: #007700">;<br /> }<br /> }<br /> return </span><span style="color: #0000BB">0</span><span style="color: #007700">; </span><span style="color: #FF8000">// $op1 == $op2<br /></span><span style="color: #007700">}<br /></span><span style="color: #0000BB">?></span> </span> </code></div> </div> </div> </p> <p class="para"> See also <span class="function"><a href="function.strcasecmp.html" class="function">strcasecmp()</a></span>, <span class="function"><a href="function.strcmp.html" class="function">strcmp()</a></span>, <a href="language.operators.array.html" class="link">Array operators</a>, and the manual section on <a href="language.types.html" class="link">Types</a>. </p> <div class="warning"><strong class="warning">Warning</strong> <h1 class="title">Comparison of floating point numbers</h1> <p class="para"> Because of the way <span class="type"><a href="language.types.float.html" class="type float">float</a></span>s are represented internally, you should not test two <span class="type"><a href="language.types.float.html" class="type float">float</a></span>s for equality. </p> <p class="para"> See the documentation for <span class="type"><a href="language.types.float.html" class="type float">float</a></span> for more information. </p> </div> <div class="sect2" id="language.operators.comparison.ternary"> <h3 class="title">Ternary Operator</h3> <p class="para"> Another conditional operator is the "?:" (or ternary) operator. <div class="example" id="example-123"> <p><strong>Example #3 Assigning a default value</strong></p> <div class="example-contents"> <div class="phpcode"><code><span style="color: #000000"> <span style="color: #0000BB"><?php<br /></span><span style="color: #FF8000">// Example usage for: Ternary Operator<br /></span><span style="color: #0000BB">$action </span><span style="color: #007700">= (empty(</span><span style="color: #0000BB">$_POST</span><span style="color: #007700">[</span><span style="color: #DD0000">'action'</span><span style="color: #007700">])) ? </span><span style="color: #DD0000">'default' </span><span style="color: #007700">: </span><span style="color: #0000BB">$_POST</span><span style="color: #007700">[</span><span style="color: #DD0000">'action'</span><span style="color: #007700">];<br /><br /></span><span style="color: #FF8000">// The above is identical to this if/else statement<br /></span><span style="color: #007700">if (empty(</span><span style="color: #0000BB">$_POST</span><span style="color: #007700">[</span><span style="color: #DD0000">'action'</span><span style="color: #007700">])) {<br /> </span><span style="color: #0000BB">$action </span><span style="color: #007700">= </span><span style="color: #DD0000">'default'</span><span style="color: #007700">;<br />} else {<br /> </span><span style="color: #0000BB">$action </span><span style="color: #007700">= </span><span style="color: #0000BB">$_POST</span><span style="color: #007700">[</span><span style="color: #DD0000">'action'</span><span style="color: #007700">];<br />}<br /><br /></span><span style="color: #0000BB">?></span> </span> </code></div> </div> </div> The expression <em>(expr1) ? (expr2) : (expr3)</em> evaluates to <span class="replaceable">expr2</span> if <span class="replaceable">expr1</span> evaluates to <strong><code>TRUE</code></strong>, and <span class="replaceable">expr3</span> if <span class="replaceable">expr1</span> evaluates to <strong><code>FALSE</code></strong>. </p> <p class="para"> Since PHP 5.3, it is possible to leave out the middle part of the ternary operator. Expression <em>expr1 ?: expr3</em> returns <span class="replaceable">expr1</span> if <span class="replaceable">expr1</span> evaluates to <strong><code>TRUE</code></strong>, and <span class="replaceable">expr3</span> otherwise. </p> <blockquote class="note"><p><strong class="note">Note</strong>: <span class="simpara"> Please note that the ternary operator is a statement, and that it doesn't evaluate to a variable, but to the result of a statement. This is important to know if you want to return a variable by reference. The statement <em>return $var == 42 ? $a : $b;</em> in a return-by-reference function will therefore not work and a warning is issued in later PHP versions. </span> </p></blockquote> <blockquote class="note"><p><strong class="note">Note</strong>: <p class="para"> It is recommended that you avoid "stacking" ternary expressions. PHP's behaviour when using more than one ternary operator within a single statement is non-obvious: <div class="example" id="example-124"> <p><strong>Example #4 Non-obvious Ternary Behaviour</strong></p> <div class="example-contents"> <div class="phpcode"><code><span style="color: #000000"> <span style="color: #0000BB"><?php<br /></span><span style="color: #FF8000">// on first glance, the following appears to output 'true'<br /></span><span style="color: #007700">echo (</span><span style="color: #0000BB">true</span><span style="color: #007700">?</span><span style="color: #DD0000">'true'</span><span style="color: #007700">:</span><span style="color: #0000BB">false</span><span style="color: #007700">?</span><span style="color: #DD0000">'t'</span><span style="color: #007700">:</span><span style="color: #DD0000">'f'</span><span style="color: #007700">);<br /><br /></span><span style="color: #FF8000">// however, the actual output of the above is 't'<br />// this is because ternary expressions are evaluated from left to right<br /><br />// the following is a more obvious version of the same code as above<br /></span><span style="color: #007700">echo ((</span><span style="color: #0000BB">true </span><span style="color: #007700">? </span><span style="color: #DD0000">'true' </span><span style="color: #007700">: </span><span style="color: #0000BB">false</span><span style="color: #007700">) ? </span><span style="color: #DD0000">'t' </span><span style="color: #007700">: </span><span style="color: #DD0000">'f'</span><span style="color: #007700">);<br /><br /></span><span style="color: #FF8000">// here, you can see that the first expression is evaluated to 'true', which<br />// in turn evaluates to (bool)true, thus returning the true branch of the<br />// second ternary expression.<br /></span><span style="color: #0000BB">?></span> </span> </code></div> </div> </div> </p> </p></blockquote> </div> </div><hr /><div class="manualnavbar" style="text-align: center;"> <div class="prev" style="text-align: left; float: left;"><a href="language.operators.bitwise.html">Bitwise Operators</a></div> <div class="next" style="text-align: right; float: right;"><a href="language.operators.errorcontrol.html">Error Control Operators</a></div> <div class="up"><a href="language.operators.html">Operators</a></div> <div class="home"><a href="index.html">PHP Manual</a></div> </div></body></html>