Контакты

Некоторые особенности работы с массивами. Массив сравнения PHP Php сравнение массивов по значению

Сравнение двух массивов с одинаковыми значениями (дублируемыми или нет, с учетом ввода-манипуляции) может быть выполнено с помощью array_diff() в оба направления:

Array_diff($a, $b) && !array_diff($b, $a);

Это дает TRUE , если оба массива имеют одинаковые значения (после манипуляции с типом). FALSE в противном случае. Примеры:

Function array_equal_values(array $a, array $b) { return !array_diff($a, $b) && !array_diff($b, $a); } array_equal_values(, ); # FALSE array_equal_values(, ); # FALSE array_equal_values(["1"], ); # TRUE array_equal_values(["1"], ); # TRUE

Как показывает этот пример, array_diff оставляет ключи массива из уравнения и не заботится о порядке значений и ни о том, что значения дублируются, либо нет.

Если дублирование должно иметь значение, это становится более сложным. Что касается "простых" значений (работают только строковые и целочисленные значения), array_count_values() входит в игру для сбора информации о том, какое значение как часто внутри массива. Эта информация легко сравнивается с == :

Array_count_values($a) == array_count_values($b);

Это дает TRUE , если оба массива имеют одинаковые значения (после манипуляции с типом) за такое же количество времени. FALSE в противном случае. Примеры:

Function array_equal_values(array $a, array $b) { return array_count_values($a) == array_count_values($b); } array_equal_values(, ); # TRUE array_equal_values(, ); # TRUE array_equal_values(["2", "2"], ); # FALSE array_equal_values(["2.0", "2"], ); # TRUE

Это может быть дополнительно оптимизировано путем сравнения количества первых двух массивов, которое является относительно дешевым, и быстрого теста, чтобы рассказать большинству массивов обособленно, если подсчет дублирования значений имеет значение.

Эти примеры до сих пор частично ограничены строковыми и целочисленными значениями, и строгое сравнение с array_diff невозможно. Более строгое сравнение для array_search . Таким образом, значения нужно подсчитывать и индексировать так, чтобы их можно было сравнить, просто превратив их в ключ (как это делает array_search).

Это немного больше работы. Однако в итоге сравнение будет таким же, как и раньше:

$count($a) == $count($b);

Это просто $count , что делает разницу:

$table = ; $count = function (array $array) use (&$table) { $exit = (bool)$table; $result = ; foreach ($array as $value) { $key = array_search($value, $table, true); if (FALSE !== $key) { if (!isset($result[$key])) { $result[$key] = 1; } else { $result[$key]++; } continue; } if ($exit) { break; } $key = count($table); $table[$key] = $value; $result[$key] = 1; } return $result; };

Это сохраняет таблицу значений, чтобы оба массива могли использовать один и тот же индекс. Также возможно выйти с первого раза в первый раз во втором массиве с новым значением.

Эта функция также может добавить строгий контекст, добавив дополнительный параметр. И добавив еще один дополнительный параметр, вы можете позволить искать дубликаты или нет. Полный пример:

Function array_equal_values(array $a, array $b, $strict = FALSE, $allow_duplicate_values = TRUE) { $add = (int)!$allow_duplicate_values; if ($add and count($a) !== count($b)) { return FALSE; } $table = ; $count = function (array $array) use (&$table, $add, $strict) { $exit = (bool)$table; $result = ; foreach ($array as $value) { $key = array_search($value, $table, $strict); if (FALSE !== $key) { if (!isset($result[$key])) { $result[$key] = 1; } else { $result[$key] += $add; } continue; } if ($exit) { break; } $key = count($table); $table[$key] = $value; $result[$key] = 1; } return $result; }; return $count($a) == $count($b); }

Примеры использования:

Array_equal_values(["2.0", "2", 2], ["2", "2.0", 2], TRUE); # TRUE array_equal_values(["2.0", "2", 2, 2], ["2", "2.0", 2], TRUE); # TRUE array_equal_values(["2.0", "2", 2, 2], ["2", "2.0", 2], TRUE, FALSE); # FALSE array_equal_values(["2"], ["2"], TRUE, FALSE); # TRUE array_equal_values(, ["2", 2]); # TRUE array_equal_values(, ["2", 2], FALSE); # TRUE array_equal_values(, ["2", 2], FALSE, TRUE); # FALSE

» Сравнение массивов в PHP

Навигация по Самоучителю: 1.1 О PHP 1.2 История PHP 1.3 Почему именно PHP? 1.4 Как это все (PHP) работает? 1.5 От интерпретатора к компилятору 1.6 Возможности PHP 1.7 Что необходимо для работы? 1.8 Ответы на ваши вопросы 1.9 Заключение к главе 2.1 Установка и конфигурирование 2.2 Установка Apache 2.3 Установка PHP 2.4 Установка MySQL 2.5 Настройка Apache 2.6 Настройка PHP 2.7 Настройка MySQL 2.8 Тестирование программ Apache, PHP 2.9 Заключение к главе 2 3.1 Синтаксис языка PHP 3.2 Профессиональная вставка 3.3 РНР и HTML 3.4 Комментарии в языке (коде) PHP 3.5 Оформление PHP кода программы 3.6 Заключение к главе 3 4.1 Переменные. Что такое переменные? 4.2 Переменные. Типы данных в PHP 4.3 Integer. Тип данных. 4.4 Double. Тип данных. 4.5 Boolean. Тип данных. 4.6 Другие типы данных 4.7 Определение переменных в PHP 4.8 Изменение типа данных в PHP 4.9 Ссылки на переменные в PHP 4.10 Динамические переменные в PHP 4.11 Что такое Константы в PHP? 4.12 Определение констант в языке PHP 4.13 Предопределенные константы в языке PHP 4.14 Заключение к главе 4 5.1 Операторы в PHP 5.2 Оператор присваивания в PHP 5.3 Арифметические операторы в PHP 5.4 Операторы отношения в PHP 5.5 Логические операторы в PHP 5.6 Поразрядные операторы в PHP 5.7 Строковые операторы в PHP 5.8 Оператор подавления ошибок в PHP 5.9 Операторы увеличения и уменьшения в PHP 5.10 Сокращенная запись присвоения переменных в PHP 5.11 Приоритетность и ассоциативность в PHP 5.12 Заключение к главе 5 6.1 Управляющие операторы PHP 6.2 Условный оператор IF 6.3 Условный оператор Elseif 6.4 Условный оператор Switch 6.5 Операторы цикла For 6.6 Оператор цикла While 6.7 Оператор цикла Do...while 6.8 Безусловный оператор Break 6.9 Безусловный оператор Continue 6.10 Безусловный оператор Exit 6.11 Require 6.12 Include 6.13 Заключение к главе 6 7.1 Функции в PHP 7.2 Определение функций в PHP 7.3 Аргументы функций в PHP 7.4 Область видимости переменных 7.5 Время жизни переменных в PHP 7.6 Рекурсия в PHP 7.7 Динамический вызов функций в PHP 7.8 Заключение к главе 7 8.1 Массивы в PHP 8.2 Присвоение значений массивов PHP 8.3 Функция array () PHP 8.4 Вывод PHP массивов 8.5 Обход массивов PHP. Функция count(), Конструкции foreach() 8.6 Функция reset() 8.7 each() 8.8 list() 8.9 Сложение массивов 8.10 Сравнение массивов 8.11 Добавление элементов массива 8.12 Удаление элементов массива 8.13 Сортировка массивов 8.14 Многомерные массивы 8.15 Преобразование в массив 8.16 Заключение к главе 8 9.1 Строка 9.2 Обработка переменных внутри строк 9.3 Вывод строк 9.4 Форматированный вывод строк 9.5 Длина строки в PHP 9.6 Поиск подстроки в строке 9.7 Чистка строк 9.8 Заключение к главе 9 10.1 Работа с HTML-формами 10.2 Передача данных HTML-формы. Метод GET и POST 10.3 Получение данных в PHP 10.4 Суперглобальные массивы $_GЕТ и $_POST 10.5 Заключение к главе 10 11.1 Открытие файлов в PHP 11.2 Закрытие файлов в PHP 11.3 Чтение и запись файлов в PHP 11.4 Копирование, удаление и переименование файлов в PHP 11.5 Получение информации о файлах в PHP 11.6 Файловый указатель в PHP 11.7 Открытие и закрытие каталогов в PHP 11.8 Чтение каталогов в PHP 11.9 Создание и удаление каталогов в PHP 11.10 Заключение к главе 11 12.1 Работа с базами данных MySQL в PHP 12.2 Соединение PHP с сервером базы данных MySQL 12.3 Создание и удаление базы данных MySQL 12.4 Создание и удаление таблиц MySQL 12.5 Работа с данными MySQL 12.6 Заключение к главе 12 13.1 Работа с изображениями в PHP. Библиотека GD 13.2 Создание и вывод изображений в PHP 13.3 Модификация изображений в PHP 13.4 Работа с текстом в PHP 13.5 Заключение к главе 13 14.1 Работа с датой и временем в PHP 14.2 Символы форматирования даты и времени в PHP 14.3 Функция date() и getdate() в PHP 14.4 Преобразования к абсолютному времени в PHP 14.5 Заключение к главе 14 15.1 Работа с регулярными выражениями в PHP 15.2 Регулярные выражения POSIX в PHP 15.3 Метасимволы в PHP 15.4 Классы символов 15.5 Квантификаторы 15.6 Замена по шаблону 15.7 Примеры регулярных выражений 15.8 Заключение к главе 15 16.1 Работа с Cookies в PHP 16.2 Создание Cookies в PHP 16.3 Чтение из Cookies 16.4 Удаление Cookies 16.5 Заключение к главе 16

Сравнение массивов производится с помощью привычных для нас операторов отношений. Наибольший интерес в этом плане вызывают операторы равенства (==) и эквивалентности (===).

Массивы считаются равными, в том случае, если каждый элемент одного массива имеет один равный ему во втором, и наоборот. Равенство элементов подразумевает соответственно совпадение ключа и значения. Порядок расположения элементов при этом не играет роли (листинг 8.12).

Листинг 8.12. Сравнение массивов.

‹html›
‹head›
‹title›Сравнение массивов‹/title›
‹/head›
‹body›
‹?php
$closets_1 = array ("Ботинки","Футболка");
$closets_2 = array ("1" => "Футболка", "0" => "Ботинки");
if ($closets_1 == $closets_2)
{
echo "Массивы равны";
}
else
{
echo "Массивы неравны";
}
?›
‹/body›
‹/html›

Заметьте, что индексы второго массива находятся в двойных кавычках, а значит имеют тип String. Но в данном случае сравниваются значения, а не типы, поэтому программа все равно выведет сообщение о равенстве массивов. То же самое относится к значениям элементов в массиве.

Иначе дело обстоит с оператором эквивалентности, который требует от своих операндов не только равенства значений, но и одинаковый порядок следования элементов в массиве (листинг 8.13).

Листинг 8.13. Эквивалентность массивов.

‹html›
‹head›
‹title›Эквивалентность массивов‹/title›
‹/head›
‹body›
‹?php
$closets_1=
array ("Ботинки", "Футболка");
$closets_2=
array("1" => "Футболка", "0" => "Ботинки");
if ($closets_1 === $closets_2)
{
echo "Массивы эквивалентны";
}
else
{
echo "Массивы неэквивалентны";
}
?›
‹/body›
‹/html›

В этом случае программа выведет, что массивы неэквивалентны. Наряду с разобранными операторами существуют также операторы неравенства (!=) и неэквивалентности (!==), которые работают аналогично, но результат выполнения будет противоположный.

И операторов массивов:

Пример Название Результат
$a + $b Объединение Объединение массива $a и массива $b.
$a == $b Равно TRUE в случае, если $a и $b содержат одни и те же элементы.
$a === $b Тождественно равно TRUE в случае, если $a и $b содержат одни и те же элементы в том же самом порядке.
$a != $b Не равно TRUE
$a <> $b Не равно TRUE если массив $a не равен массиву $b.
$a !== $b Тождественно не равно TRUE если массив $a не равен тождественно массиву $b.

Пример сравнения массивов:

Некоторы полезные практические примеры по работе с массивами

// это
$a = array("color" => "red" ,
"taste" => "sweet" ,
"shape" => "round" ,
"name" => "apple" ,
4 // ключом будет 0
);

// полностью соответствует
$a [ "color" ] = "red" ;
$a [ "taste" ] = "sweet" ;
$a [ "shape" ] = "round" ;
$a [ "name" ] = "apple" ;
$a = 4 ; // ключом будет 0

$b = "a" ;
$b = "b" ;
$b = "c" ;
// создаст массив array(0 => "a" , 1 => "b" , 2 => "c"),
// или просто array("a", "b", "c")
?>

Еще один практический пример:

// Массив как карта (свойств)
$map = array("version" => 4 ,
"OS" => "Linux" ,
"lang" => "english" ,
"short_tags" => true
);

// исключительно числовые ключи
$array = array(7 ,
8 ,
0 ,
156 ,
- 10
);
// это то же самое, что и array(0 => 7, 1 => 8, ...)

$switching = array(10 , // ключ = 0
5 => 6 ,
3 => 7 ,
"a" => 4 ,
11 , // ключ = 6 (максимальным числовым индексом был 5)
"8" => 2 , // ключ = 8 (число!)
"02" => 77 , // ключ = "02"
0 => 12 // значение 10 будет перезаписано на 12
);

// пустой массив
$empty = array();
?>

Коллекция:

$colors = array("красный" , "синий" , "зеленый" , "желтый" );

Foreach ($colors as $color ) {
echo "Вам нравится $color?\n" ;
}
?>

Результат работы рассмотренного скрипта:

Вам нравится красный? Вам нравится синий? Вам нравится зеленый? Вам нравится желтый?

Следующий пример создает начинающийся с единицы массив:

$firstquarter = array(1 => "Январь" , "Февраль" , "Март" );
print_r ($firstquarter );

?>

Результат работы приведенного скрипта будет следующий:

Пример заполнения массива:

// заполняет массив всеми элементами директории
$handle = opendir ("." );
while (false !== ($file = readdir ($handle ))) {
$files = $file ;
}
closedir ($handle );
?>

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

Рекурсивные и многомерные массивы:

$fruits = array ("фрукты" => array ("a" => "апельсин" ,
"b" => "банан" ,
"c" => "яблоко"
),
"числа" => array (1 ,
2 ,
3 ,
4 ,
5 ,
6
),
"дырки" => array ("первая" ,
5 => "вторая" ,
"третья"
);

// Несколько примеров доступа к значениям предыдущего массива
echo $fruits [ "дырки" ][ 5 ]; // напечатает "вторая"
echo $fruits [ "фрукты" ][ "a" ]; // напечатает "апельсин"
unset($fruits [ "дырки" ][ 0 ]); // удалит "первая"

// Создаст новый многомерный массив
$juices [ "яблоко" ][ "зеленое" ] = "хорошее" ;
?>

Обратите внимание, что при присваивании массива всегда происходит копирование значения. Чтобы копировать массив по ссылке, вам нужно использовать оператор ссылки:

$arr1 = array(2 , 3 );
$arr2 = $arr1 ;
$arr2 = 4 ; // $arr2 изменился,
// $arr1 по прежнему array(2,3)

$arr3 = & $arr1 ;
$arr3 = 4 ; // теперь $arr1 и $arr3 эквивалентны
?>

Мы рассмотрели основные возможности по работе с массивами. Некоторую дополнительную информацию вы можете найти в разделе "Работа с переменными " статей по PHP.


Есть еще вопросы или что-то непонятно - добро пожаловать на наш
Понравилась статья? Поделитесь ей