Статьи

Операторы массивов в PHP: интересно, но не очень понятно

Операторы в PHP могут быть разбиты на семь различных категорий: арифметические, присваивающие, побитовые, сравнения, контроля ошибок, выполнения, увеличения / уменьшения, логические операторы, операторы строки, массива и типа. В этой статье подробно описывается работа с операторами массивов, а также рассматривается работа некоторых других операторов при использовании массивов.

Операторы массива

Официальная документация предоставляет только краткое описание каждого из операторов массива, что иногда может сделать его неоднозначным относительно того, что ожидать от каждого оператора. Давайте посмотрим на каждый из операторов массива для более четкого понимания того, что они делают. Все эти операторы являются двоичными, то есть каждый из них работает ровно на двух массивах.

Array Union

Первым является оператор объединения ( + Это делает потерю соответствия ключей, и все ключи второго массива игнорируются, если их эквивалентный ключ уже существует в первом массиве. Остальные ключи (и соответствующие значения) второго массива добавляются к первому.

 <?php
$array1 = array('a', 'b', 'c');
$array2 = array('d', 'e', 'f', 'g', 'h', 'i');
print_r($array1 + $array2);
print_r($array2 + $array1);
  массив
 (
     [0] => а
     [1] => б
     [2] => с
     [3] => г
     [4] => ч
     [5] => я
 )
 массив
 (
     [0] => д
     [1] => е
     [2] => f
     [3] => г
     [4] => ч
     [5] => я
 ) 

С первым print_r()$array2$array1 Со вторым print_r()$array2

Поведение свободного соответствия может дать вам совершенно неожиданные результаты, но также открывает захватывающие возможности для оптимизации и свободного кода.

 <?php
$array1 = array('0' => 'a', '1' => 'b', '2' => 'c', '3' => 'd');
$array2 = array(false => 'e', 1 => 'f', 2 => 'g', 3 => 'h', 4 => 'i');
print_r($array1 + $array2);
  массив
 (
     [0] => а
     [1] => б
     [2] => с
     [3] => д
     [4] => я
 ) 

Часто неправильно понимают, что объединение основано на значениях массива, тогда как в действительности этот оператор реализует объединение ключей массива. Для объединения на основе значений вы можете использовать комбинацию array_merge()array_unique()

 <?php
$union = array_unique(array_merge($array1, $array2));
print_r($union);
  массив
 (
     [0] => а
     [1] => б
     [2] => с
     [3] => д
     [4] => е
     [5] => f
     [6] => г
     [7] => ч
     [8] => я
 ) 

Массив Равенство

Оператор равенства ( == Оператор возвращает true, если все пары ключ-значение в первом массиве имеют эквивалентные пары ключ-значение во втором массиве. Он сопоставляет значения и ключи свободно, а последовательность элементов игнорируется.

 <?php
$array1 = array('1' => 1, '2' => 2, '3' => 3, '0' => 0);
$array2 = array(false => '0', 1 => '1', 2 => '2', 3 => '3');
var_dump($array1 == $array2);
  BOOL (истина) 

Последовательность элементов в двух массивах различна, но одинаковые значения связаны с одинаковыми ключами в каждом массиве. Однако следующее не эквивалентно, поскольку оба массива имеют разные пары ключ-значение:

 <?php
$array1 = array(1, 2);
$array2 = array(2, 1);
var_dump($array1 == $array2);
  BOOL (ложь) 

Оператор неравенства ( !=<> Все, для чего оператор равенства возвращает false, этот оператор возвращает true, и наоборот.

 <?php
$array1 = array('1' => 1, '2' => 2, '3' => 3, '0' => 0);
$array2 = array(false => '0', 1 => '1', 2 => '2', 3 => '3');
var_dump($array1 != $array2);
  BOOL (ложь) 

Array Identity

Оператор идентификации ( === Массивы идентичны, если оба массива:

  • имеют одинаковое количество элементов
  • имеют одинаковые пары ключ-значение
  • имеют одинаковую последовательность элементов
  • имеют одинаковый тип данных всех соответствующих значений

Однако для ключей массива оператор идентификации совпадает слабо, если ключ является целым числом, и аналогичная строковая запись целого числа существует как ключ в другом массиве. В случае совпадения ключа с плавающей запятой этот оператор выполняется строго. Руководство по PHP не разъясняет эту разницу.

 <?php
// arrays are almost identical but keys have different types
$array1 = array('0' => '0', '1' => '1', '2' => '2', '3' => '3');
$array2 = array(0 => '0', 1 => '1', 2 => '2', 3 => '3');
var_dump($array1 === $array2);
  BOOL (истина) 
 <?php
// the sequence of elements in both arrays is not the same
$array1 = array('0' => '0', '1' => '1', '2' => '2', '3' => '3');
$array2 = array(1 => '1', 2 => '2', 3 => '3', 0 => '0');
var_dump($array1 === $array2);
  BOOL (ложь) 
 <?php
// the key in the first array is a string and in the second is a float
$array1 = array('0.5' => '0');
$array2 = array(0.5 => '0');
var_dump($array1 === $array2);
  BOOL (ложь) 

Оператор неидентификации ( !== Опять же, этот оператор является полной противоположностью оператора тождественности, что означает, что этот оператор возвращает false для сравнения массивов, если они идентичны.

 <?php
$array1 = array('0' => '0', '1' => '1', '2' => '2', '3' => '3');
$array2 = array(0 => '0', 1 => '1', 2 => '2', 3 => '3');
var_dump($array1 !== $array2);
  BOOL (ложь) 

Использование массивов с другими операторами

PHP ведет себя иначе, когда к массивам применяются операторы, отличные от указанных выше. Вот список этих операторов и их поведение, когда они применяются к массивам.

Неустранимая ошибка: неожиданный тип операнда

PHP выдает фатальную ошибку, когда к массивам применяются следующие операторы:

  • побитовый оператор ( ~
  • Оператор арифметического отрицания ( -
  • арифметический оператор вычитания ( -
  • оператор арифметического умножения ( *
  • оператор арифметического деления ( /

Массивы рассматриваются как целые числа

Массивы обрабатываются как целые числа при использовании со следующими операторами. Пустой массив (без элементов) рассматривается как int(0)int(1)

  • Logical-not ( !
  • Побитовый-и ( &
  • Побитовый или ( |
  • Bitwise-xor ( ^ Если один из массивов пуст, он возвращает 1.
  • Сдвиг массива на n шагов влево с помощью оператора left-shit ( <<1 << n В противном случае он возвращает 0 (результат 0 << n
  • Оператор вправо-сдвиг ( >>
  • Модуль ( % Если второй массив пуст, он выдает ошибку «Деление на ноль». Если первый массив пуст, он возвращает 0 (результат 0 % 1
  • Логические-и ( &&AND Если оба массива не пусты, он возвращает true.
  • Logical-or ( ||OR Если оба массива пусты, возвращается false.
  • Если оба массива либо пустые, либо непустые, логический xor ( XOR В противном случае он возвращает true, если один из массивов пуст.
  • Приведение массива к bool

Массивы рассматриваются как строки

При объединении двух массивов оператор объединения строк ( .

 <?php
$array1 = array(0, 1, 2, 3);
$array1 = array(0, 1, 2, 3);
var_dump($array1 . $array2);
  Строка (10) "ArrayArray" 

Нет эффекта

Увеличивающаяся / уменьшающаяся категория операторов ( ++--

 <?php
$array1 = $array2;
var_dump((++$array1) === $array2);
  BOOL (истина) 

Вывод

Фактическая документация о том, как операторы PHP ведут себя при использовании с массивами, немногочисленна, но для получения дополнительной информации вы можете посмотреть комментарии, представленные пользователем, на странице операторов массива. Ваши вопросы и комментарии приветствуются здесь, и я с удовольствием объясню вещи дальше.

Изображение через Fotolia