<?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 => 'ru',
  ),
  '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' => 'ru',
    '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>
      Возвращается <strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong>, если значение переменной <var class="varname">$a</var>
      после преобразования типов равно
      значению переменной <var class="varname">$b</var>.
     </td>
    </tr>

    <tr>
     <td>$a === $b</td>
     <td>Тождественно равно</td>
     <td>
      Возвращается <strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong>, если значение переменной <var class="varname">$a</var>
      равно значению переменной <var class="varname">$b</var> и имеет тот же тип.
     </td>
    </tr>

    <tr>
     <td>$a != $b</td>
     <td>Не равно</td>
     <td>
      Возвращается <strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong>, если значение переменной <var class="varname">$a</var>
      после преобразования типов
      не равно значению переменной <var class="varname">$b</var>.
     </td>
    </tr>

    <tr>
     <td>$a &lt;&gt; $b</td>
     <td>Не равно</td>
     <td>
      Возвращается <strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong>, если значение переменной <var class="varname">$a</var>
      после преобразования типов
      не равно значению переменной <var class="varname">$b</var>.
     </td>
    </tr>

    <tr>
     <td>$a !== $b</td>
     <td>Тождественно не равно</td>
     <td>
      Возвращается <strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong>, если значение переменной <var class="varname">$a</var>
      не равно значению переменной <var class="varname">$b</var>
      или они разных типов.
     </td>
    </tr>

    <tr>
     <td>$a &lt; $b</td>
     <td>Меньше</td>
     <td>
      Возвращается <strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong>, если значение переменной <var class="varname">$a</var>
      строго меньше значения переменной <var class="varname">$b</var>.
     </td>
    </tr>

    <tr>
     <td>$a &gt; $b</td>
     <td>Больше</td>
     <td>
      Возвращается <strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong>, если значение переменной <var class="varname">$a</var>
      строго больше значения переменной <var class="varname">$b</var>.
     </td>
    </tr>

    <tr>
     <td>$a &lt;= $b</td>
     <td>Меньше или равно</td>
     <td>
      Возвращается <strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong>, если значение переменной <var class="varname">$a</var>
      меньше или равно значению переменной <var class="varname">$b</var>.
     </td>
    </tr>

    <tr>
     <td>$a &gt;= $b</td>
     <td>Больше или равно</td>
     <td>
      Возвращается <strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong>, если значение переменной <var class="varname">$a</var>
      больше или равно значению переменной <var class="varname">$b</var>.
     </td>
    </tr>

    <tr>
     <td>$a &lt;=&gt; $b</td>
     <td>Космический корабль (spaceship)</td>
     <td>
      Целое число (<span class="type"><a href="language.types.integer.php" class="type int">int</a></span>) меньше, больше или равное нулю, когда
      значение переменной <var class="varname">$a</var> меньше, больше или равно
      значению переменной <var class="varname">$b</var>.
     </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, если строка (<span class="type"><a href="language.types.string.php" class="type string">string</a></span>) сравнивалась с числом
   или числовой строкой, то перед выполнением сравнения строка (<span class="type"><a href="language.types.string.php" class="type string">string</a></span>)
   преобразовывалась в число. Это иногда давало неожиданные
   результаты, как видно в следующем примере:
   <div class="informalexample">
    <div class="example-contents">
<div class="annotation-interactive phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><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 /><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 /><br /></span><span style="color: #FF8000">// Целые числа<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 />// Числа с плавающей точкой<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>
      Массив с меньшим количеством элементов меньше,
      если PHP не нашёл ключ из первого массива во втором массиве —
      массивы несравнимы, иначе идёт сравнение
      значения за значением (смотрите пример ниже)
     </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>

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

   </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 /><br /></span><span style="color: #FF8000">// Логические значения и null сравниваются как логические<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  — то же, что и (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  — то же, что и (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  — то же, что и (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  — то же, что и (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 это FALSE &lt; TRUE<br /><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 /><br /></span><span style="color: #FF8000">// Массивы сравниваются как в этом примере — со стандартными операторами сравнения, и оператором «космический корабль» (spaceship).<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 /><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 /><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">}</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
   не всегда даёт предсказуемый результат при сравнении значений разных типов,
   особенно при сравнении целых чисел (<span class="type"><a href="language.types.integer.php" class="type int">int</a></span>) с логическими значениями (<span class="type"><a href="language.types.boolean.php" class="type bool">bool</a></span>)
   или целых чисел (<span class="type"><a href="language.types.integer.php" class="type int">int</a></span>) со строками (<span class="type"><a href="language.types.string.php" class="type string">string</a></span>).
   Поэтому лучше пользоваться операторами <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">Операторы работы с массивами</a></li>
    <li><a href="language.types.php" class="link">Типы</a></li>
   </ul>
  </p>
 </div>

 <div class="sect2" id="language.operators.comparison.ternary">
  <h3 class="title">Тернарный оператор</h3>
  <p class="para">
   Список условных операторов дополняет тернарный оператор «?:».
   <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 /><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 /><br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
    </div>

   </div>
   Выражение <code class="literal">(expr1) ? (expr2) : (expr3)</code>
   интерпретируется как <span class="replaceable">expr2</span>, если
   <span class="replaceable">expr1</span> равно <strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong>, или как
   <span class="replaceable">expr3</span>, если
   <span class="replaceable">expr1</span> равно <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong>.
  </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">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> не будет
    работать в функции, возвращающей значение по ссылке, а в более поздних
    версиях PHP также будет выдано предупреждение.
   </span>
  </p></blockquote>
  <blockquote class="note"><p><strong class="note">Замечание</strong>: 
   <p class="para">
    Рекомендовано избегать «нагромождения» тернарных выражений.
    Поведение 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 /><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">// Однако код выводит "t" до PHP 8.0.0.<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", которое<br />// оценивается как логическое (bool) true, поэтому возвращает истинную ветвь<br />// второго тернарного выражения<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">
    Цепочка коротких тернарных операторов (<code class="literal">?:</code>), однако, стабильна и ведёт себя обоснованно.
    Она будет оценивать первый аргумент, который оценивается как не ложное значение.
    Обратите внимание, что неопределённые значения все равно вызовут предупреждение.
    <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 /><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 /><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">
   Другой полезный сокращённый оператор — это оператор объединения с NULL — «??» (null coalescing).
   <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 /><br /></span><span style="color: #FF8000">// Пример работы с оператором нулевого слияния<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 />}</span></span></code></div>
    </div>

   </div>
   Выражение <code class="literal">(expr1) ?? (expr2)</code> вычисляется так:
   <span class="replaceable">expr2</span>, если <span class="replaceable">expr1</span> равно
   <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong>, иначе <span class="replaceable">expr1</span>.
  </p>
  <p class="para">
   Этот оператор не вызывает предупреждения или ошибки, если левый операнд
   не существует, точно как языковая конструкция <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 /><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 /><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 /><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 coalescing</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); ?>