Сравнение многомерных массивов php

Сравнение многомерных массивов php

array_udiff — Вычисляет расхождение массивов, используя для сравнения callback-функцию

Описание

Вычисляет расхождение массивов, используя для сравнения данных callback-функцию. Это отличается от поведения array_diff() , которая использует встроенную функцию для сравнения данных.

Список параметров

Callback-функция, используемая для сравнения.

Функция сравнения должна возвращать целое, которое меньше, равно или больше нуля, если первый аргумент является соответственно меньшим, равным или большим, чем второй. Обратите внимание, что до PHP 7.0.0 это целое должно было находиться в диапазоне с -2147483648 до 2147483647.

Возвращаемые значения

Возвращает массив, содержащий все элементы array1 , которые не существуют в каком-либо из других аргументов.

Примеры

Пример #1 Пример использования array_udiff() с объектами класса stdClass

// массивы для сравнения
$array1 = array(new stdclass , new stdclass ,
new stdclass , new stdclass ,
);

$array2 = array(
new stdclass , new stdclass ,
);

// проставление некоторых свойств для объектов
$array1 [ 0 ]-> width = 11 ; $array1 [ 0 ]-> height = 3 ;
$array1 [ 1 ]-> width = 7 ; $array1 [ 1 ]-> height = 1 ;
$array1 [ 2 ]-> width = 2 ; $array1 [ 2 ]-> height = 9 ;
$array1 [ 3 ]-> width = 5 ; $array1 [ 3 ]-> height = 7 ;

$array2 [ 0 ]-> width = 7 ; $array2 [ 0 ]-> height = 5 ;
$array2 [ 1 ]-> width = 9 ; $array2 [ 1 ]-> height = 2 ;

function compare_by_area ( $a , $b ) <
$areaA = $a -> width * $a -> height ;
$areaB = $b -> width * $b -> height ;

if ( $areaA $areaB ) <
return — 1 ;
> elseif ( $areaA > $areaB ) <
return 1 ;
> else <
return 0 ;
>
>

print_r ( array_udiff ( $array1 , $array2 , ‘compare_by_area’ ));
?>

Результат выполнения данного примера:

Пример #2 Пример использования array_udiff() с объектами класса DateTime

class MyCalendar <
public $free = array();
public $booked = array();

public function __construct ( $week = ‘now’ ) <
$start = new DateTime ( $week );
$start -> modify ( ‘Monday this week midnight’ );
$end = clone $start ;
$end -> modify ( ‘Friday this week midnight’ );
$interval = new DateInterval ( ‘P1D’ );
foreach (new DatePeriod ( $start , $interval , $end ) as $freeTime ) <
$this -> free [] = $freeTime ;
>
>

public function bookAppointment ( DateTime $date , $note ) <
$this -> booked [] = array( ‘date’ => $date -> modify ( ‘midnight’ ), ‘note’ => $note );
>

public function checkAvailability () <
return array_udiff ( $this -> free , $this -> booked , array( $this , ‘customCompare’ ));
>

public function customCompare ( $free , $booked ) <
if ( is_array ( $free )) $a = $free [ ‘date’ ];
else $a = $free ;
if ( is_array ( $booked )) $b = $booked [ ‘date’ ];
else $b = $booked ;
if ( $a == $b ) <
return 0 ;
> elseif ( $a > $b ) <
return 1 ;
> else <
return — 1 ;
>
>
>

// Создание календаря еженедельных встреч
$myCalendar = new MyCalendar ;

// Запись некоторых еженедельных встреч
$myCalendar -> bookAppointment (new DateTime ( ‘Monday this week’ ), "Уборка квартиры сотрудника Google." );
$myCalendar -> bookAppointment (new DateTime ( ‘Wednesday this week’ ), "Катание на сноуборде." );
$myCalendar -> bookAppointment (new DateTime ( ‘Friday this week’ ), "Борьба с багами в коде." );

// Проверка доступности дней путем сравнения дат в $booked с датами из $free
echo "Я доступен в следующие дни на этой неделе.

Читайте также:  Термостат к59 l1275 схема подключения

" ;
foreach ( $myCalendar -> checkAvailability () as $free ) <
echo $free -> format ( ‘l’ ), "
" ;
>
echo "

" ;
echo "Я занят в следующие дни на этой неделе.

" ;
foreach ( $myCalendar -> booked as $booked ) <
echo $booked [ ‘date’ ]-> format ( ‘l’ ), ": " , $booked [ ‘note’ ], "
" ;
>
?>

Результат выполнения данного примера:

Примечания

Замечание: Обратите внимание, что эта функция обрабатывает только одно измерение многомерного массива. Разумеется, вы можете обработать более одного измерения, используя array_udiff($array1[0], $array2[0], "data_compare_func");.

Смотрите также

  • array_diff() — Вычислить расхождение массивов
  • array_diff_assoc() — Вычисляет расхождение массивов с дополнительной проверкой индекса
  • array_diff_uassoc() — Вычисляет расхождение массивов с дополнительной проверкой индекса, осуществляемой при помощи callback-функции
  • array_udiff_assoc() — Вычисляет расхождение в массивах с дополнительной проверкой индексов, используя для сравнения значений callback-функцию
  • array_udiff_uassoc() — Вычисляет расхождение в массивах с дополнительной проверкой индексов, используя для сравнения значений и индексов callback-функцию
  • array_intersect() — Вычисляет схождение массивов
  • array_intersect_assoc() — Вычисляет схождение массивов с дополнительной проверкой индекса
  • array_uintersect() — Вычисляет пересечение массивов, используя для сравнения значений callback-функцию
  • array_uintersect_assoc() — Вычисляет пересечение массивов с дополнительной проверкой индексов, используя для сравнения значений callback-функцию
  • array_uintersect_uassoc() — Вычисляет пересечение массивов с дополнительной проверкой индекса, используя для сравнения индексов и значений индивидуальные callback-функции

User Contributed Notes 9 notes

I think the example given here using classes is convoluting things too much to demonstrate what this function does.

array_udiff() will walk through array_values($a) and array_values($b) and compare each value by using the passed in callback function.

To put it another way, array_udiff() compares $a[0] to $b[0], $b[1], $b[2], and $b[3] using the provided callback function. If the callback returns zero for any of the comparisons then $a[0] will not be in the returned array from array_udiff(). It then compares $a[1] to $b[0], $b[1], $b[2], and $b[3]. Then, finally, $a[2] to $b[0], $b[1], $b[2], and $b[3].

For example, compare_ids($a[0], $b[0]) === -5 while compare_ids($a[1], $b[1]) === 0. Therefore, $a[1] is not returned from array_udiff() since it is present in $b.

function compare_ids($a, $b)
<
return ($a[‘id’] — $b[‘id’]);
>
function compare_names($a, $b)
<
return strcmp($a[‘name’], $b[‘name’]);
>

$ret = array_udiff($a, $b, ‘compare_ids’);
var_dump($ret);

$ret = array_udiff($b, $a, ‘compare_ids’);
var_dump($ret);

$ret = array_udiff($a, $b, ‘compare_names’);
var_dump($ret);
?>

Which returns the following.

In the first return we see that $b has no entry in it with an id of 10.

array(3) <
["id"]=>
int(10)
["name"]=>
string(4) "John"
["color"]=>
string(3) "red"
>
>
?>

In the second return we see that $a has no entry in it with an id of 15 or 40.

array(3) <
["id"]=>
int(15)
["name"]=>
string(5) "Nancy"
["color"]=>
string(5) "black"
>
[3]=>
array(3) <
["id"]=>
int(40)
["name"]=>
string(4) "John"
["color"]=>
string(6) "orange"
>
>
?>

Читайте также:  Переделка ламп подсветки жк монитора

In third return we see that all names in $a are in $b (even though the entry in $b whose name is ‘John’ is different, the anonymous function is only comparing names).

Note that the compare function is used also internally, to order the arrays and choose which element compare against in the next round.

If your compare function is not really comparing (ie. returns 0 if elements are equals, 1 otherwise), you will receive an unexpected result.

I think the point being made is that array_udiff() can be used not only for comparisons between homogenous arrays, as in your example (and definitely the most common need), but it can be used to compare heterogeneous arrays, too.

function compr_1 ( $a , $b ) <
$aVal = is_array ( $a ) ? $a [ ‘last_name’ ] : $a ;
$bVal = is_array ( $b ) ? $b [ ‘last_name’ ] : $b ;
return strcasecmp ( $aVal , $bVal );
>

$aEmployees = array(
array( ‘last_name’ => ‘Smith’ ,
‘first_name’ => ‘Joe’ ,
‘phone’ => ‘555-1000’ ),
array( ‘last_name’ => ‘Doe’ ,
‘first_name’ => ‘John’ ,
‘phone’ => ‘555-2000’ ),
array( ‘last_name’ => ‘Flagg’ ,
‘first_name’ => ‘Randall’ ,
‘phone’ => ‘666-1000’ )
);

$aNames = array( ‘Doe’ , ‘Smith’ , ‘Johnson’ );

$result = array_udiff ( $aEmployees , $aNames , "compr_1" );

print_r ( $result );
?>

Allowing me to get the "employee" that’s not in the name list:

Array ( [2] => Array ( [last_name] => Flagg [first_name] => Randall [phone] => 666-1000 ) )

Something interesting to note, is that the two arguments to the compare function don’t correspond to array1 and array2. That’s why there has to be logic in it to handle that either of the arguments might be pointing to the more complex employee array. (Found this out the hard way.)

У меня есть два массива, как показано ниже

Массив 1

Массив 2

Я хочу сравнить массив выше по их suppliers а также name ключ,

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

Или может быть, что оба массива будут иметь разное количество ключей

Доброго времени суток, хабражители!

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

То, конечно, получить, интересующие нас значения, легко:

Но, а если мы имеем массив n-мерный? Например, пятимерный:

То, чтобы получить значение по ключу, например, «value1», нам надо прописать такой код:

Я такую запись не назвал бы красивой, хотя она является правильной. Я предлагаю слегка сделать эту запись красивой путем приведения ее к такому виду:

Согласитесь, ведь смотрится, действительно, куда симпотичней, по сравнению со стандартной записью.

Читайте также:  Налоговая личный кабинет хабаровск

Итак, для начала нам понадобится создать класс, который будет обрабатывать наш массив. Назовем его easyArray и сделаем его одиночкой (Singleton):

После того, как наш класс стал одиночкой, добавим ему весьма важный метод, который будет записывать полученный массив в приватную переменную:

Ну а теперь мы переопределим магический метод "__get()" нашего класса. Это необходимо для того, чтобы получить желаемый нами результат. Итак:

Первым делом, мы проверяем наличие запрошенного ключа в массиве, в случае отсутствия такового, выбрасываем исключение с ошибкой "‘Отсутствует ключ (‘.$index.’) в массиве’". Далее проверяем является ли, запрошенный ключ массивом. Если по такому ключу в массиве находится значение, то просто возвращаем это значение. А если все-таки это массив, то мы отправляем его методу "loadArray($newArray)" и возвращаем текущий объект ($this).

И, как последний штрих нашего класса, добавим метод, который будет возвращать текущий массив, с которым работает наш класс:

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

Стало даже длиннее, чем было. Но эта проблема решаема, и для этого нам понадобится простая функция:

Ну, а теперь проверим, что мы получили в итоге:

Помимо этого, данному классу можно передавать конфигурационные файлы типа:

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

Спасибо за внимание.

Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.

  • 24 сентября 2019 в 15:58 Падение популярности PHP: не все так однозначно?
  • 2 декабря 2019 в 21:06 Настройка PHP для работы Composer
  • 2 января 2020 в 13:57 Простой php фреймворк для начинающих
  • 28 февраля 2020 в 19:54 PHP: array_key_exists ищет быстрее чем in_array в 500 раз
  • 6 марта 2020 в 11:48 Как запустить .php скрипт в October CMS

Ой, у вас баннер убежал!

Это «Песочница» — раздел, в который попадают дебютные посты пользователей, желающих стать полноправными участниками сообщества.

Если у вас есть приглашение, отправьте его автору понравившейся публикации — тогда её смогут прочитать и обсудить все остальные пользователи Хабра.

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

Не надо пропускать:

  • рекламные и PR-публикации
  • вопросы и просьбы (для них есть Хабр Q&A);
  • вакансии (используйте Хабр Карьеру)
  • статьи, ранее опубликованные на других сайтах;
  • статьи без правильно расставленных знаков препинания, со смайликами, с обилием восклицательных знаков, неоправданным выделением слов и предложений и другим неуместным форматированием текста;
  • жалобы на компании и предоставляемые услуги;
  • низкокачественные переводы;
  • куски программного кода без пояснений;
  • односложные статьи;
  • статьи, слабо относящиеся к или не относящиеся к ней вовсе.
Ссылка на основную публикацию
Соевый соус стебель бамбука классический отзывы
Всем доброго дня!Много мнений по этому поводу, как вы считаете, соевый соус или морская соль, что менее вредно для организма....
Сколько секунд видео можно загрузить в инстаграм
Обновлено - 27 января 2020 IGTV — функция, с помощью которой можно выложить длинное видео в Инстаграм продолжительностью от 15...
Сколько символов на странице ворд
Вы можете посмотреть пример стандартной страницы перевода в формате doc. В рынке переводов можно встретить разные варианты определения условной страницы:...
Соевый соус ямаса отзывы
Полное наименование: Соевый Соус классический (натурально сваренный) Изготовитель: Yamasa Corporation Все характеристики Соевый соус Yamasa: Результаты теста Достоинства Безопасный Не...
Adblock detector