array_diff_assoc
(PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8)
array_diff_assoc — Вычисляет расхождение массивов с дополнительной проверкой индекса
Описание
Список параметров
Массивы для сравнения
Возвращаемые значения
Примеры
Пример #1 Пример использования array_diff_assoc()
Результат выполнения данного примера:
Пример #2 Пример использования array_diff_assoc()
Результат выполнения данного примера:
Примечания
Замечание: Убедитесь, что передаёте аргументы в правильном порядке, когда сравниваете схожие массивы с большим количеством ключей. Новый массив должен быть первым.
Смотрите также
User Contributed Notes 18 notes
Works more like the original function:
an earlier post for recursive array_diff_assoc failed because isset returned false on an array element containing a null value. I updated the code so it compares null values too.
If you’re looking for a true array_diff_assoc, comparing arrays to determine the difference between two, finding missing values from both, you can use this along with array_merge.
print_r(array_diff_assoc($b,$a));
// returns
array
(
[d] => 4
)
print_r(array_merge(array_diff_assoc($a,$b),array_diff_assoc($b,$a)));
// returns
array
(
[c] => 3
[d] => 4
)
The following will recursively do an array_diff_assoc, which will calculate differences on a multi-dimensional level. This not display any notices if a key don’t exist and if error_reporting is set to E_ALL:
The direction of the arguments does actually make a difference:
To diff between n-dimensional array, juste use this :
To unset elements in an array if you know the keys but not the values, you can do:
array_diff_assoc can also be used to find the duplicates in an array
NOTE: the diff_array also removes all the duplicate values that match to the values in the second array:
// yields: array(«b»,»c») the duplicate «a» values are removed
?>
Recursive implementation accepting multiple n-level-arrays as parameters:
For recursive diff of multiple arrays, exending solution provided by Gosh.
Yet another recursive implementation, without if-else hell and with multiple parameters just like the original.
Why array_diff() gives Array to string conversion error?
I get array to string conversion error for the following line:
9 Answers 9
One of your arrays is multidimensional.
Yes, the strict answer is because «One of your arrays is multidimensional.»
All these options will compare the entire array tree, not just the top level.
Since array_diff can only deals with one dimension, you can either:
convert your multi-dimentional array into one dimension, e.g. by:
According to PHP documentation for the function
So it looks like you can’t use this function with multi dimensional array, or in fact any value that cannot be converted to a string. This is because the function will cast values to a string to do the comparison.
This is my solution for a similar problem. I want to compare two associative arrays and return the changed values, but some of the elements are arrays. So if I use
, it gives me «Array to string error». My function will also compare the elements which are arrays and if there’s a difference, it will return the array element. It is still a work in progress and not tested extensively. For example:
if you run ::test it will return:
I’ve got the same error and found the following bug report for php:
Some of the array_* functions that compare elements in multiple arrays do so by (string)$elem1 === (string)$elem2.
Two examples of functions that can throw this are array_intersect() and array_diff().
If these functions are not expected to take arrays with other arrays as values, this should be mentioned on the documentation pages.
That report describes, why php throws an error on comparing a multi-dimensional array.
Справочник по PHP : Функции работы с данными : Работа с массивами : Работа с несколькими массивами
смотрим также
Материал из Справочник Web-языков
Содержание
array_diff
Определение исключительного пересечения массивов.
Данная функция возвращает массив, который содержит значения, имеющиеся только в массиве arr1 ( и не имеющиеся в любых других). При этом индексы сохраняются.
Повторение одного и того же значения «red» в массиве arr1 обрабатывается как одно значение.
Функция поддерживается PHP 4 >= 4.0.1, PHP 5
array_diff_assoc
Определение исключительного пересечения массивов с учетом индексов массивов.
Данная функция возвращает массив, который содержит значения, имеющиеся только в массиве arr1 ( и не имеющиеся в любых других). Обратите внимание, что в отличии от функции array_diff(), при сравнении учитываются ключи.
Пример использования array_diff_assoc():
Пример выведет следующее:
В приведенном примере пара «a» => «green» присутствует в обоих массивах, поэтому она не вошла в результирующий массив. В отличие от этого, значение red присутствует в результирующем массиве, т.к. в первом массиве это значение имело ключ 0, а во втором массиве оно имело ключ 1.
Функция поддерживается PHP 4 >=4.3.0, PHP 5
array_diff_uassoc
Определение различия между массивами при помощи пользовательской функции с дополнительной проверкой ключей массива.
Функция array_diff_uassoc() возвращает массив, который содержит значения, имеющиеся только в массиве arr1 ( и не имеющиеся в любых других).
Обратите внимание, что в отличии от функции array_diff(), при сравнении учитываются ключи. Сделано это при помощи пользовательской функции key_compare_func. Эта функция должна возвращать целое число, которое должно быть меньше нуля, если первый переданный ей аргумент меньше чем второй, равное нулю, если первый аргумент равен второму, и больше нуля, если первый аргумент больше второго. Эта функция отличается от array_diff_assoc(), где сравнение значений и индексов происходит автоматически.
Пример использования array_diff_uassoc():
Пример выведет следующее:
В приведенном примере пара «a» => «green» присутствует в обоих массивах, поэтому она не вошла в результирующий массив. В отличие от этого, значение red присутствует в результирующем массиве, т.к. в первом массиве это значение имело ключ 0, а во втором массиве оно имело ключ 1.
Равенство индексов проверяется пользовательской функцией.
Функция поддерживается PHP 5
array_udiff
Сравнивает массивы используя пользовательскую функцию.
Функция array_udiff() возвращает массив, содержащий все значения массива array1, которые не присутствуют в других массивах, переданных в параметрах.
Стоит отметить, что ключи значений сохраняются.
Для сравнения значений массивов используется пользовательская функция data_compare_func. Она возвращает число, большее нуля, равное нулю или меньшее нуля, если первый аргумент, переданные ей в виде параметра, больше, равен или меньше второго параметра соответственно. Это отличается от функции array_diff(), где используется встроенная функция сравнения. Пример использования функции array_udiff_assoc():
Этот пример выведет следующее:
Функция поддерживается PHP 5
array_udiff_assoc
Сравнивает массивы используя пользовательскую функцию.
Функция array_udiff_assoc() возвращает массив, содержащий все значения массива array1, которые не присутствуют в других массивах, переданные в параметрах. Стоит отметить, что ключи значений используются при сравнении в отличии от функций array_diff() и array_udiff().
Для сравнения значений массивов используется пользовательская функция. Этим данная функция отличается от array_diff_assoc(), которая использует внутреннюю функции для сравнения.
Пример использования функции array_udiff_assoc():
Этот пример выведет следующее:
В нашем примере пара 1=> new cr(4) присутствует в обеих массивах и по этому она не вошла в результирующий массив.
Для сравнения используется пользовательская функция. Она возвращает значение, меньшее нуля, равное нулю или большее нуля, если переданный ей первый параметр меньше второго, равен второму или больше второго соответственно.
Функция поддерживается PHP 5
array_udiff_uassoc
Сравнивает массивы используя пользовательскую функцию.
Функция array_udiff_uassoc() возвращает массив, содержащий все значения массива array1, которые не присутствуют в других массивах, переданные в параметрах. Стоит отметить, что ключи значений используются при сравнении в отличии от функций array_diff() и array_udiff().
Для сравнения значений массивов используется пользовательская функция data_compare_func. Этим данная функция отличается от array_diff_assoc(), которая использует внутреннюю функции для сравнения.
Сравнение ключей (индексов) происходит при помощи пользовательской функции key_compare_func. Этим данная функция отличается от array_udiff_assoc(), которая использует внутреннюю функции для сравнения.
Пример использования функции array_udiff_uassoc():
Этот пример выведет следующее:
В нашем примере пара 1=> new cr(4) присутствует в обеих массивах и по этому она не вошла в результирующий массив.
Для сравнения используется пользовательская функция. Она возвращает значение, меньшее нуля, равное нулю или большее нуля, если переданный ей первый параметр меньше второго, равен второму или больше второго соответственно.
Функция поддерживается PHP 5
array_intersect
Определение включительного пересечения массивов.
Функция array_intersect() возвращает массив, который содержит значения массива arr1, имеющиеся во всех остальных массивах. При этом индексы сохраняются.
Пример использования функции array_intersect():
Функция поддерживается PHP 4 >= 4.0.1, PHP 5
array_intersect_assoc
Функция возвращает пересечения значений массивов с сохранением индексов.
Функция array_intersect_assoc() возвращает массив, который содержит все значения array1, имеющиеся во всех остальных перечисленных массивах. В отличие от функции array_intersect() при сравнении ключи учитываются.
Пример использования функции array_intersect_assoc():
Пример выведет следующее:
Приведенный пример вывел только значение [a] => яблоко, т.к. это значение присутствовало и в первом и во втором массиве.
Функция поддерживается PHP 4 >= 4.3.0, PHP 5
array_merge
Функция array_merge() призвана устранить все недостатки, присущие оператору + для слияния массивов. А именно, она сливает массивы, перечисленные в ее аргументах, в один большой массив и возвращает результат. Т.е. значени одного массива присоединяются к значениям предыдущего.
Если в массивах встречаются одинаковые строковые ключи, то тогда значения, принадлежащие этим ключам, сливаются в один массив таким образом, чтобы если одно из значений в свою очередь является массивом, функция array_merge() сливает его с соответствующим значением в другом массиве.
Однако это не затрагивает числовые ключи: элементы с такими ключами помещаются в конец результирующего массива в любом случае.
Пример использования функции array_merge():
Пример выведет следующее:
Другой пример использования функции array_merge():
Пример выведет следующее:
Стоит отметить, что числовые ключи были потеряны.
Если есть необходимость просто слить массивы вместе, используйте оператор +
Пример выведет следующее:
Функция поддерживается PHP 4, PHP 5
array_merge_recursive
Рекурсивное слияние сложных массивов.
Функция array_merge_recursive() объединяет элементы массивов, переданных в ее параметрах таким образом, что значения одного массива присоединяются к значениям предудущих.
Функция возвращает массив, состоящий из объединенных массивов.
Если массивы, переданные в параметрах этой функции, имеют одинаковые строковые ключи, тогда значения, соответствующие этим ключам, сливаются в один массив. При этом если одно из значений само является массивом, то оно будет слито с соответствующим значением в другом массиве.
Но если в массивах присутствуют одинаковые числовые ключи, то тогда значение такого ключа, упомянутое последним, не заменит исходное значение, а будет слито с ним.
Пример использования функции array_merge_recursive():
Функция поддерживается PHP 4 >=, PHP 5
array_udiff
array_udiff — Computes the difference of arrays by using a callback function for data comparison
Description
Computes the difference of arrays by using a callback function for data comparison. This is unlike array_diff() which uses an internal function for comparing the data.
Parameters
Arrays to compare against.
The callback comparison function.
The comparison function must return an integer less than, equal to, or greater than zero if the first argument is considered to be respectively less than, equal to, or greater than the second.
Return Values
Returns an array containing all the values of array that are not present in any of the other arguments.
Examples
Example #1 array_udiff() example using stdClass Objects
The above example will output:
Example #2 array_udiff() example using DateTime Objects
// Create a calendar for weekly appointments
$myCalendar = new MyCalendar ;
The above example will output:
Notes
See Also
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.
Which returns the following.
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.
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.)
array_udiff
array_udiff — Вычисляет расхождение массивов, используя для сравнения callback-функцию
Описание
Список параметров
Массивы для сравнения.
Callback-функция, используемая для сравнения.
Функция сравнения должна возвращать целое, которое меньше, равно или больше нуля, если первый аргумент является соответственно меньшим, равным или большим, чем второй.
Возвращаемые значения
Примеры
Пример #1 Пример использования array_udiff() с объектами класса stdClass
Результат выполнения данного примера:
Пример #2 Пример использования array_udiff() с объектами класса DateTime
// Создание календаря еженедельных встреч
$myCalendar = new MyCalendar ;
Результат выполнения данного примера:
Примечания
Смотрите также
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.
Which returns the following.
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.
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.)


