<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/language.operators.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'ja',
  ),
  'this' => 
  array (
    0 => 'language.operators.comparison.php',
    1 => '比較演算子',
    2 => '比較演算子',
  ),
  'up' => 
  array (
    0 => 'language.operators.php',
    1 => '演算子',
  ),
  'prev' => 
  array (
    0 => 'language.operators.bitwise.php',
    1 => 'ビット演算子',
  ),
  'next' => 
  array (
    0 => 'language.operators.errorcontrol.php',
    1 => 'エラー制御演算子',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'ja',
    'path' => 'language/operators/comparison.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="language.operators.comparison" class="sect1">
 <h2 class="title">比較演算子</h2>
 
 <p class="simpara">
  比較演算子は、その名前が示すように、二つの値を比較します。
  <a href="types.comparisons.php" class="link">型の比較表</a>
  に、型に関連するさまざまな比較の例があります。
 </p>
 <table class="doctable table">
  <caption><strong>比較演算子</strong></caption>
  
   <thead>
    <tr>
     <th>例</th>
     <th>名前</th>
     <th>結果</th>
    </tr>

   </thead>

   <tbody class="tbody">
    <tr>
     <td>$a == $b</td>
     <td>等しい</td>
     <td>型の相互変換をした後で <var class="varname">$a</var> が <var class="varname">$b</var> に等しい時に <strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong>。</td>
    </tr>

    <tr>
     <td>$a === $b</td>
     <td>等しい</td>
     <td><var class="varname">$a</var> が <var class="varname">$b</var> に等しく、および同じ型である場合に <strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong> 。
     </td>
    </tr>

    <tr>
     <td>$a != $b</td>
     <td>等しくない</td>
     <td>型の相互変換をした後で <var class="varname">$a</var> が <var class="varname">$b</var> に等しくない場合に <strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong>。</td>
    </tr>

    <tr>
     <td>$a &lt;&gt; $b</td>
     <td>等しくない</td>
     <td>型の相互変換をした後で <var class="varname">$a</var> が <var class="varname">$b</var> に等しくない場合に <strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong>。</td>
    </tr>

    <tr>
     <td>$a !== $b</td>
     <td>等しくない</td>
     <td>
      <var class="varname">$a</var> が <var class="varname">$b</var> と等しくないか、同じ型でない場合に <strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong> 。
     </td>
    </tr>

    <tr>
     <td>$a &lt; $b</td>
     <td>より少ない</td>
     <td><var class="varname">$a</var> が <var class="varname">$b</var> より少ない時に <strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong>。</td>
    </tr>

    <tr>
     <td>$a &gt; $b</td>
     <td>より多い</td>
     <td><var class="varname">$a</var> が <var class="varname">$b</var> より多い時に <strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong>。</td>
    </tr>

    <tr>
     <td>$a &lt;= $b</td>
     <td>より少ないか等しい</td>
     <td><var class="varname">$a</var> が <var class="varname">$b</var> より少ないか等しい時に <strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong>。</td>
    </tr>

    <tr>
     <td>$a &gt;= $b</td>
     <td>より多いか等しい</td>
     <td><var class="varname">$a</var> が <var class="varname">$b</var> より多いか等しい時に <strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong>。</td>
    </tr>

    <tr>
     <td>$a &lt;=&gt; $b</td>
     <td>宇宙船演算子</td>
     <td>
      <var class="varname">$a</var> が
      <var class="varname">$b</var> より小さい場合は、0より小さい整数。
      <var class="varname">$a</var> が
      <var class="varname">$b</var> と等しい場合は、0。
      <var class="varname">$a</var> が
      <var class="varname">$b</var> より大きい場合は、0より大きい整数。
     </td>
    </tr>

   </tbody>
  
 </table>

 <p class="para">
  オペランドが両方
  <a href="language.types.numeric-strings.php" class="link">数値形式の文字列</a> の場合、
  もしくは一方が数値で、もう一方が
  <a href="language.types.numeric-strings.php" class="link">数値形式の文字列</a> の場合、
  比較は数値として行われます。
  これらのルールは
  <a href="control-structures.switch.php" class="link">switch</a> 文にも適用されます。
  型の変換は
  演算子が <code class="literal">===</code> や <code class="literal">!==</code> の場合は行われません。
  なぜなら、これらの演算子は、値と型を両方比較するものだからです。
 </p>

 <div class="warning"><strong class="warning">警告</strong>
  <p class="para">
   PHP 8.0.0 より前のバージョンでは、
   文字列が数値または数値形式の文字列の場合、文字列は比較する前に数値に変換されていました。
   これによって、以下の例で見られるような驚きの結果が生じる場合があります:
   <div class="informalexample">
    <div class="example-contents">
<div class="annotation-interactive phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?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">);<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">);<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">);<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">);<br /><br />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">:<br />  echo </span><span style="color: #DD0000">"a"</span><span style="color: #007700">;<br />  break;<br />}<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
    </div>

    <p class="para">上の例の PHP 7 での出力は、このようになります。</p>
    <div class="example-contents screen">
<div class="annotation-interactive cdata"><pre>
bool(true)
bool(true)
bool(true)
bool(true)
0
</pre></div>
    </div>
    <p class="para">上の例の PHP 8 での出力は、このようになります。:</p>
    <div class="example-contents screen">
<div class="annotation-interactive cdata"><pre>
bool(false)
bool(true)
bool(true)
bool(true)
a
</pre></div>
    </div>
   </div>
  </p>
 </div>

 <p class="para">
  <div class="example" id="example-1">
   <p><strong>例1 比較演算子</strong></p>
   <div class="example-contents">
<div class="annotation-interactive phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php  <br /></span><span style="color: #FF8000">// Integer<br /></span><span style="color: #007700">echo </span><span style="color: #0000BB">1 </span><span style="color: #007700">&lt;=&gt; </span><span style="color: #0000BB">1</span><span style="color: #007700">, </span><span style="color: #DD0000">' '</span><span style="color: #007700">; </span><span style="color: #FF8000">// 0<br /></span><span style="color: #007700">echo </span><span style="color: #0000BB">1 </span><span style="color: #007700">&lt;=&gt; </span><span style="color: #0000BB">2</span><span style="color: #007700">, </span><span style="color: #DD0000">' '</span><span style="color: #007700">; </span><span style="color: #FF8000">// -1<br /></span><span style="color: #007700">echo </span><span style="color: #0000BB">2 </span><span style="color: #007700">&lt;=&gt; </span><span style="color: #0000BB">1</span><span style="color: #007700">, </span><span style="color: #DD0000">' '</span><span style="color: #007700">; </span><span style="color: #FF8000">// 1<br /> <br />// Float<br /></span><span style="color: #007700">echo </span><span style="color: #0000BB">1.5 </span><span style="color: #007700">&lt;=&gt; </span><span style="color: #0000BB">1.5</span><span style="color: #007700">, </span><span style="color: #DD0000">' '</span><span style="color: #007700">; </span><span style="color: #FF8000">// 0<br /></span><span style="color: #007700">echo </span><span style="color: #0000BB">1.5 </span><span style="color: #007700">&lt;=&gt; </span><span style="color: #0000BB">2.5</span><span style="color: #007700">, </span><span style="color: #DD0000">' '</span><span style="color: #007700">; </span><span style="color: #FF8000">// -1<br /></span><span style="color: #007700">echo </span><span style="color: #0000BB">2.5 </span><span style="color: #007700">&lt;=&gt; </span><span style="color: #0000BB">1.5</span><span style="color: #007700">, </span><span style="color: #DD0000">' '</span><span style="color: #007700">; </span><span style="color: #FF8000">// 1<br /> <br />// 文字列<br /></span><span style="color: #007700">echo </span><span style="color: #DD0000">"a" </span><span style="color: #007700">&lt;=&gt; </span><span style="color: #DD0000">"a"</span><span style="color: #007700">, </span><span style="color: #DD0000">' '</span><span style="color: #007700">; </span><span style="color: #FF8000">// 0<br /></span><span style="color: #007700">echo </span><span style="color: #DD0000">"a" </span><span style="color: #007700">&lt;=&gt; </span><span style="color: #DD0000">"b"</span><span style="color: #007700">, </span><span style="color: #DD0000">' '</span><span style="color: #007700">; </span><span style="color: #FF8000">// -1<br /></span><span style="color: #007700">echo </span><span style="color: #DD0000">"b" </span><span style="color: #007700">&lt;=&gt; </span><span style="color: #DD0000">"a"</span><span style="color: #007700">, </span><span style="color: #DD0000">' '</span><span style="color: #007700">; </span><span style="color: #FF8000">// 1<br /> <br /></span><span style="color: #007700">echo </span><span style="color: #DD0000">"a" </span><span style="color: #007700">&lt;=&gt; </span><span style="color: #DD0000">"aa"</span><span style="color: #007700">, </span><span style="color: #DD0000">' '</span><span style="color: #007700">;  </span><span style="color: #FF8000">// -1<br /></span><span style="color: #007700">echo </span><span style="color: #DD0000">"zz" </span><span style="color: #007700">&lt;=&gt; </span><span style="color: #DD0000">"aa"</span><span style="color: #007700">, </span><span style="color: #DD0000">' '</span><span style="color: #007700">; </span><span style="color: #FF8000">// 1<br /> <br />// 配列<br /></span><span style="color: #007700">echo [] &lt;=&gt; [], </span><span style="color: #DD0000">' '</span><span style="color: #007700">;               </span><span style="color: #FF8000">// 0<br /></span><span style="color: #007700">echo [</span><span style="color: #0000BB">1</span><span style="color: #007700">, </span><span style="color: #0000BB">2</span><span style="color: #007700">, </span><span style="color: #0000BB">3</span><span style="color: #007700">] &lt;=&gt; [</span><span style="color: #0000BB">1</span><span style="color: #007700">, </span><span style="color: #0000BB">2</span><span style="color: #007700">, </span><span style="color: #0000BB">3</span><span style="color: #007700">], </span><span style="color: #DD0000">' '</span><span style="color: #007700">; </span><span style="color: #FF8000">// 0<br /></span><span style="color: #007700">echo [</span><span style="color: #0000BB">1</span><span style="color: #007700">, </span><span style="color: #0000BB">2</span><span style="color: #007700">, </span><span style="color: #0000BB">3</span><span style="color: #007700">] &lt;=&gt; [], </span><span style="color: #DD0000">' '</span><span style="color: #007700">;        </span><span style="color: #FF8000">// 1<br /></span><span style="color: #007700">echo [</span><span style="color: #0000BB">1</span><span style="color: #007700">, </span><span style="color: #0000BB">2</span><span style="color: #007700">, </span><span style="color: #0000BB">3</span><span style="color: #007700">] &lt;=&gt; [</span><span style="color: #0000BB">1</span><span style="color: #007700">, </span><span style="color: #0000BB">2</span><span style="color: #007700">, </span><span style="color: #0000BB">1</span><span style="color: #007700">], </span><span style="color: #DD0000">' '</span><span style="color: #007700">; </span><span style="color: #FF8000">// 1<br /></span><span style="color: #007700">echo [</span><span style="color: #0000BB">1</span><span style="color: #007700">, </span><span style="color: #0000BB">2</span><span style="color: #007700">, </span><span style="color: #0000BB">3</span><span style="color: #007700">] &lt;=&gt; [</span><span style="color: #0000BB">1</span><span style="color: #007700">, </span><span style="color: #0000BB">2</span><span style="color: #007700">, </span><span style="color: #0000BB">4</span><span style="color: #007700">], </span><span style="color: #DD0000">' '</span><span style="color: #007700">; </span><span style="color: #FF8000">// -1<br /> <br />// オブジェクト<br /></span><span style="color: #0000BB">$a </span><span style="color: #007700">= (object) [</span><span style="color: #DD0000">"a" </span><span style="color: #007700">=&gt; </span><span style="color: #DD0000">"b"</span><span style="color: #007700">]; <br /></span><span style="color: #0000BB">$b </span><span style="color: #007700">= (object) [</span><span style="color: #DD0000">"a" </span><span style="color: #007700">=&gt; </span><span style="color: #DD0000">"b"</span><span style="color: #007700">]; <br />echo </span><span style="color: #0000BB">$a </span><span style="color: #007700">&lt;=&gt; </span><span style="color: #0000BB">$b</span><span style="color: #007700">, </span><span style="color: #DD0000">' '</span><span style="color: #007700">; </span><span style="color: #FF8000">// 0<br /> <br /></span><span style="color: #0000BB">$a </span><span style="color: #007700">= (object) [</span><span style="color: #DD0000">"a" </span><span style="color: #007700">=&gt; </span><span style="color: #DD0000">"b"</span><span style="color: #007700">]; <br /></span><span style="color: #0000BB">$b </span><span style="color: #007700">= (object) [</span><span style="color: #DD0000">"a" </span><span style="color: #007700">=&gt; </span><span style="color: #DD0000">"c"</span><span style="color: #007700">]; <br />echo </span><span style="color: #0000BB">$a </span><span style="color: #007700">&lt;=&gt; </span><span style="color: #0000BB">$b</span><span style="color: #007700">, </span><span style="color: #DD0000">' '</span><span style="color: #007700">; </span><span style="color: #FF8000">// -1<br /> <br /></span><span style="color: #0000BB">$a </span><span style="color: #007700">= (object) [</span><span style="color: #DD0000">"a" </span><span style="color: #007700">=&gt; </span><span style="color: #DD0000">"c"</span><span style="color: #007700">]; <br /></span><span style="color: #0000BB">$b </span><span style="color: #007700">= (object) [</span><span style="color: #DD0000">"a" </span><span style="color: #007700">=&gt; </span><span style="color: #DD0000">"b"</span><span style="color: #007700">]; <br />echo </span><span style="color: #0000BB">$a </span><span style="color: #007700">&lt;=&gt; </span><span style="color: #0000BB">$b</span><span style="color: #007700">, </span><span style="color: #DD0000">' '</span><span style="color: #007700">; </span><span style="color: #FF8000">// 1<br /> <br />// 比較するのは値だけではない; キーも一致しなければならない<br /></span><span style="color: #0000BB">$a </span><span style="color: #007700">= (object) [</span><span style="color: #DD0000">"a" </span><span style="color: #007700">=&gt; </span><span style="color: #DD0000">"b"</span><span style="color: #007700">]; <br /></span><span style="color: #0000BB">$b </span><span style="color: #007700">= (object) [</span><span style="color: #DD0000">"b" </span><span style="color: #007700">=&gt; </span><span style="color: #DD0000">"b"</span><span style="color: #007700">]; <br />echo </span><span style="color: #0000BB">$a </span><span style="color: #007700">&lt;=&gt; </span><span style="color: #0000BB">$b</span><span style="color: #007700">, </span><span style="color: #DD0000">' '</span><span style="color: #007700">; </span><span style="color: #FF8000">// 1<br /><br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

  </div>
 </p>

 <p class="para">
  多くの型では、以下の表にしたがって（上から順に）比較が行われます。
 </p>
 <table id="language.operators.comparison.types" class="doctable table">
  <caption><strong>さまざまな型の比較</strong></caption>
  
   <thead>
    <tr>
     <th>第 1 オペランドの型</th>
     <th>第 2 オペランドの型</th>
     <th>結果</th>
    </tr>

   </thead>

   <tbody class="tbody">
    <tr>
     <td><span class="type"><a href="language.types.null.php" class="type null">null</a></span> または <span class="type"><a href="language.types.string.php" class="type string">string</a></span></td>
     <td><span class="type"><a href="language.types.string.php" class="type string">string</a></span></td>
     <td><strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong> を &quot;&quot; に変換し、数値または文字として比較します</td>
    </tr>

    <tr>
     <td><span class="type"><a href="language.types.boolean.php" class="type bool">bool</a></span> または <span class="type"><a href="language.types.null.php" class="type null">null</a></span></td>
     <td>あらゆる型</td>
     <td>両辺を <span class="type"><a href="language.types.boolean.php" class="type bool">bool</a></span> に変換し、<strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong> &lt; <strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong> と判断します</td>
    </tr>

    <tr>
     <td><span class="type"><a href="language.types.object.php" class="type object">object</a></span></td>
     <td><span class="type"><a href="language.types.object.php" class="type object">object</a></span></td>
     <td>組み込みクラスには独自の比較基準が定義されています。
      異なるクラスは比較できません。同じクラスであるかどうかは 
      <a href="language.oop5.object-comparison.php" class="link">ここで説明されています</a>。
     </td>
    </tr>

    <tr>
     <td><span class="type"><a href="language.types.string.php" class="type string">string</a></span>, <span class="type"><a href="language.types.resource.php" class="type resource">resource</a></span>, <span class="type"><a href="language.types.integer.php" class="type int">int</a></span> または <span class="type"><a href="language.types.float.php" class="type float">float</a></span></td>
     <td><span class="type"><a href="language.types.string.php" class="type string">string</a></span>, <span class="type"><a href="language.types.resource.php" class="type resource">resource</a></span>, <span class="type"><a href="language.types.integer.php" class="type int">int</a></span> または <span class="type"><a href="language.types.float.php" class="type float">float</a></span></td>
     <td>文字列やリソースを数値に変換し、算術演算を行います</td>
    </tr>

    <tr>
     <td><span class="type"><a href="language.types.array.php" class="type array">array</a></span></td>
     <td><span class="type"><a href="language.types.array.php" class="type array">array</a></span></td>
     <td>要素数の少ない配列のほうが小さくなります。オペランド 1 のキーが
      オペランド 2 に存在しない場合、配列は比較できません。そうでない場合は
      個々の要素の値を比較します（以下の例を参照ください）</td>
    </tr>

    <tr>
     <td><span class="type"><a href="language.types.object.php" class="type object">object</a></span></td>
     <td>あらゆる型</td>
     <td><span class="type"><a href="language.types.object.php" class="type object">object</a></span> のほうが常に大きくなります</td>
    </tr>

    <tr>
     <td><span class="type"><a href="language.types.array.php" class="type array">array</a></span></td>
     <td>あらゆる型</td>
     <td><span class="type"><a href="language.types.array.php" class="type array">array</a></span> のほうが常に大きくなります</td>
    </tr>

   </tbody>
  
 </table>


 <p class="para">
  <div class="example" id="example-2">
   <p><strong>例2 Boolean/null の比較</strong></p>
   <div class="example-contents">
<div class="annotation-interactive phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?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">&lt; </span><span style="color: #0000BB">TRUE</span><span style="color: #007700">); </span><span style="color: #FF8000">// FALSE - same as (bool) 100 &lt; 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">&lt; </span><span style="color: #0000BB">FALSE</span><span style="color: #007700">);</span><span style="color: #FF8000">// FALSE - same as (bool) -10 &lt; 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 &lt; (bool) -100 is FALSE &lt; TRUE<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

  </div>
 </p>

 <p class="para">
  <div class="example" id="example-3">
   <p><strong>例3 一般的な配列の比較</strong></p>
   <div class="example-contents">
<div class="annotation-non-interactive phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #FF8000">// 標準の比較演算子や、宇宙船演算子を用いて、配列はこのように比較されます<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">) &lt; </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 &lt; $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">) &gt; </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 &gt; $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">=&gt; </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">1</span><span style="color: #007700">;<br />      } elseif (</span><span style="color: #0000BB">$val </span><span style="color: #007700">&lt; </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">&gt; </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">?&gt;</span></span></code></div>
   </div>

  </div> 
 </p>

 <div class="warning"><strong class="warning">警告</strong>
  <h1 class="title">浮動小数点数値の比較</h1>

  <p class="para">
   ふたつの <span class="type"><a href="language.types.float.php" class="type float">float</a></span> 値が等しいかどうかを調べてはいけません。
   <span class="type"><a href="language.types.float.php" class="type float">float</a></span> の内部的な表現方法がその理由です。
  </p>

  <p class="para">
   詳細な情報は <span class="type"><a href="language.types.float.php" class="type float">float</a></span> のドキュメントを参照ください。
  </p>
 </div>

 <blockquote class="note"><p><strong class="note">注意</strong>: 
  <span class="simpara">
   PHP における型の相互変換の動作は、
   異なる型同士を比較する時には必ずしも自明でないことに注意して下さい。
   整数型 と boolean を比較したり、
   整数型 を 文字列 と比較する場合は特にそうです。
   よって一般的には、
   <code class="literal">==</code> や <code class="literal">!=</code>
   ではなく
   <code class="literal">===</code> と <code class="literal">!==</code>
   を使う方がほとんどの場合は好ましいです。
  </span>
 </p></blockquote>

 <div class="sect2" id="language.operators.comparison.incomparable">
  <h3 class="title">比較できない値</h3>
  <p class="simpara">
   (<code class="literal">===</code> や <code class="literal">!==</code> を使った)
   同一性の比較は、あらゆる値に適用できますが、
   それ以外の演算子は、比較できる値同士の場合にのみ適用可能です。
   比較できない値同士を比較した場合の結果は未定義であり、
   その結果に依存すべきではありません。
  </p>
 </div>

 <div class="sect2">
  <h3 class="title">参考</h3>
  <p class="para">
   <ul class="simplelist">
    <li><span class="function"><a href="function.strcasecmp.php" class="function">strcasecmp()</a></span></li>
    <li><span class="function"><a href="function.strcmp.php" class="function">strcmp()</a></span></li>
    <li><a href="language.operators.array.php" class="link">Array operators</a></li>
    <li><a href="language.types.php" class="link">Types</a></li>
   </ul>
  </p>
 </div>

 <div class="sect2" id="language.operators.comparison.ternary">
  <h3 class="title">三項演算子</h3>
  <p class="para">
   もうひとつの条件演算子として &quot;?:&quot;（あるいは三項）演算子があります。
   <div class="example" id="example-4">
    <p><strong>例4 デフォルト値を設定する</strong></p>
    <div class="example-contents">
<div class="annotation-interactive phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #FF8000">// 三項演算子の使用例<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">// 上記は以下の if/else 式と同じです。<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 /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
    </div>

   </div> 
   <code class="literal">(expr1) ? (expr2) : (expr3)</code>
   という式は、<span class="replaceable">式1</span> が <strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong> の場合に
   <span class="replaceable">式2</span> を、
   <span class="replaceable">式1</span> が <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong> の場合に
   <span class="replaceable">式3</span> を値とします。
  </p>
  <p class="para">
   三項演算子のまんなかの部分をなくすこともできます。
   式 <code class="literal">expr1 ?: expr3</code> の結果は、<span class="replaceable">expr1</span> が
   <strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong> と同等の場合は <span class="replaceable">expr1</span>、
   それ以外の場合は <span class="replaceable">expr3</span> となります。
   この場合、<span class="replaceable">expr1</span> は一度だけ評価されます。
  </p>
  <blockquote class="note"><p><strong class="note">注意</strong>: 
   <span class="simpara">
    三項演算子は式であり、値としては評価されずに式の結果として評価される
    ことに注意してください。演算結果をリファレンスとして返したい場合に、
    これを知っておくことが大切です。結果をリファレンスとして返す関数で
    <code class="literal">return $var == 42 ? $a : $b;</code> とすることはできず、
    警告が発生します。
   </span>
  </p></blockquote>
  <blockquote class="note"><p><strong class="note">注意</strong>: 
   <p class="para">
    三項演算子を &quot;積み重ねて&quot; 使用することは避けましょう。
    ひとつの文の中で括弧で囲わずに複数の三項演算子を使用した際の PHP の振る舞いは、
    他のプログラミング言語のそれと比べて、少々わかりにくいものです。

    PHP 8.0.0 より前のバージョンでは、三項演算子は左から右に評価されていました。
    他の殆どのプログラミング言語では、右から左に評価されます。
    左から右に評価される振る舞いに依存することは、PHP 7.4.0 以降は推奨されません。
    PHP 8.0.0 以降は、三項演算子はどの演算とも結合しなくなっています。
    <div class="example" id="example-5">
     <p><strong>例5 三項演算子のわかりにくい挙動</strong></p>
     <div class="example-contents">
<div class="annotation-interactive phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #FF8000">// ぱっと見た感じでは、これは '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">// しかし、PHP 8.0.0 より前のバージョンでは、実際には上の出力結果は 't' です。<br />// なぜなら、三項演算子は左結合だったからです。<br /><br />// 上のコードをもう少しわかりやすく書くと、このようになります。<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">// まず、最初の式が 'true' と評価されます。この 'true' は<br />// (bool) true と評価されるので、それをもとに二番目の三項<br />// 演算子が評価されます。<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
     </div>

    </div>
   </p>
  </p></blockquote>
  <blockquote class="note"><p><strong class="note">注意</strong>: 
   <p class="para">
    一方で、三項演算子の短縮形の挙動は安定しており、
    理にかなった動作をします。
    これは、<strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong> と評価されない最初の引数を評価します。
    但し、未定義の値については未だ警告が出るので注意して下さい。
    <div class="example" id="example-6">
     <p><strong>例6 三項演算子の短縮形</strong></p>
     <div class="example-contents">
<div class="annotation-interactive phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">echo </span><span style="color: #0000BB">0 </span><span style="color: #007700">?: </span><span style="color: #0000BB">1 </span><span style="color: #007700">?: </span><span style="color: #0000BB">2 </span><span style="color: #007700">?: </span><span style="color: #0000BB">3</span><span style="color: #007700">, </span><span style="color: #0000BB">PHP_EOL</span><span style="color: #007700">; </span><span style="color: #FF8000">//1<br /></span><span style="color: #007700">echo </span><span style="color: #0000BB">0 </span><span style="color: #007700">?: </span><span style="color: #0000BB">0 </span><span style="color: #007700">?: </span><span style="color: #0000BB">2 </span><span style="color: #007700">?: </span><span style="color: #0000BB">3</span><span style="color: #007700">, </span><span style="color: #0000BB">PHP_EOL</span><span style="color: #007700">; </span><span style="color: #FF8000">//2<br /></span><span style="color: #007700">echo </span><span style="color: #0000BB">0 </span><span style="color: #007700">?: </span><span style="color: #0000BB">0 </span><span style="color: #007700">?: </span><span style="color: #0000BB">0 </span><span style="color: #007700">?: </span><span style="color: #0000BB">3</span><span style="color: #007700">, </span><span style="color: #0000BB">PHP_EOL</span><span style="color: #007700">; </span><span style="color: #FF8000">//3<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
     </div>

    </div>
   </p>
  </p></blockquote>
 </div>
 
 <div class="sect2" id="language.operators.comparison.coalesce">
  <h3 class="title">Null 合体演算子</h3>
  <p class="para">
   別の便利な短縮形式の演算子として、
   &quot;??&quot; 演算子 (Null 合体演算子) を使うことが出来ます。
   <div class="example" id="example-7">
    <p><strong>例7 デフォルト値の代入</strong></p>
    <div class="example-contents">
<div class="annotation-interactive phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #FF8000">// Null 合体演算子の使用例<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">] ?? </span><span style="color: #DD0000">'default'</span><span style="color: #007700">;<br /><br /></span><span style="color: #FF8000">// 上の文は、この if/else 文と同じ意味です<br /></span><span style="color: #007700">if (isset(</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: #0000BB">$_POST</span><span style="color: #007700">[</span><span style="color: #DD0000">'action'</span><span style="color: #007700">];<br />} else {<br />  </span><span style="color: #0000BB">$action </span><span style="color: #007700">= </span><span style="color: #DD0000">'default'</span><span style="color: #007700">;<br />}<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
    </div>

   </div>
   式 <code class="literal">(expr1) ?? (expr2)</code> は、
   <span class="replaceable">expr1</span> が <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong> である場合は <span class="replaceable">expr2</span>
   と評価され、それ以外の場合は <span class="replaceable">expr1</span> と評価されます。
  </p>
  <p class="para">
   この演算子は、左側の値が存在しない場合でも notice や warning が発生しません。
   <span class="function"><a href="function.isset.php" class="function">isset()</a></span> と同じ挙動です。
   これは、配列のキーを扱う場合に便利です。
  </p>
  <blockquote class="note"><p><strong class="note">注意</strong>: 
   <span class="simpara">
    Null 合体演算子は式であることに注意しましょう。変数として評価されるのではなく、式の結果として評価されます。
    変数を参照で返そうとするときには、これを意識しておくことが重要です。
    参照返しの関数で <code class="literal">return $foo ?? $bar;</code> のように書いてもうまく動かずに、
    警告が発生します。
   </span>
  </p></blockquote>

  <blockquote class="note"><p><strong class="note">注意</strong>: 
   <p class="para">
    Null 合体演算子の優先順位は低いです。
    (文字列結合や、算術演算子のような)
    他の演算子と組み合わせる場合には、おそらくカッコが必要になるでしょう。
   </p>
   <div class="example-contents">
<div class="annotation-interactive phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #FF8000">// $name が未定義の場合、警告が発生します。<br /></span><span style="color: #007700">print </span><span style="color: #DD0000">'Mr. ' </span><span style="color: #007700">. </span><span style="color: #0000BB">$name </span><span style="color: #007700">?? </span><span style="color: #DD0000">'Anonymous'</span><span style="color: #007700">;<br /></span><span style="color: #FF8000">// "Mr. Anonymous" と出力<br /></span><span style="color: #007700">print </span><span style="color: #DD0000">'Mr. ' </span><span style="color: #007700">. (</span><span style="color: #0000BB">$name </span><span style="color: #007700">?? </span><span style="color: #DD0000">'Anonymous'</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

  </p></blockquote>
  <blockquote class="note"><p><strong class="note">注意</strong>: 
   <p class="para">
    Null 合体演算子はネストさせることもできます。
    <div class="example" id="example-8">
     <p><strong>例8 Null 合体演算子のネスト</strong></p>
     <div class="example-contents">
<div class="annotation-interactive phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br />$foo </span><span style="color: #007700">= </span><span style="color: #0000BB">null</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$bar </span><span style="color: #007700">= </span><span style="color: #0000BB">null</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$baz </span><span style="color: #007700">= </span><span style="color: #0000BB">1</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$qux </span><span style="color: #007700">= </span><span style="color: #0000BB">2</span><span style="color: #007700">;<br /><br />echo </span><span style="color: #0000BB">$foo </span><span style="color: #007700">?? </span><span style="color: #0000BB">$bar </span><span style="color: #007700">?? </span><span style="color: #0000BB">$baz </span><span style="color: #007700">?? </span><span style="color: #0000BB">$qux</span><span style="color: #007700">; </span><span style="color: #FF8000">// 出力は 1 です<br /><br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
     </div>

    </div>
   </p>
  </p></blockquote>
 </div> 
</div><?php manual_footer($setup); ?>