Функция cot_arrayDiff в Cotonti
Функция cot_arrayDiff.
Эта функция находит разницу между двумя массивами, как array_diff в PHP, но она рекурсивно обрабатывает многомерные массивы. В отличие от стандартной функции array_diff, которая работает только для одномерных массивов, эта функция может правильно сравнивать и вычислять разницу для многомерных массивов.
Код функции
/**
* Computes the difference of arrays
* array_diff() for n-dimensional arrays
*
* Native php function array_diff() only checks one dimension of a n-dimensional array.
* When trying to compare n-dimensional ones it generates warning: Array to string conversion because it compares
* elements by their string representation (if (string) $elem1 === (string) $elem2)
*
* @param array $array1 The array to compare from
* @param array $array2 The array to compare with
* @return array an array containing all the entries from array1 that are not present in any of the other arrays.
*
* @see array_diff()
* @see https://php.net/manual/en/function.array-diff.php
*
* @todo make signature compatible with native array_diff() function:
* array_diff(array $array, array ...$arrays): array
*/
function cot_arrayDiff(array $array1, array $array2)
{
$return = [];
foreach ($array1 as $mKey => $mValue) {
if (array_key_exists($mKey, $array2)) {
if (is_array($mValue)) {
$aRecursiveDiff = cot_arrayDiff($mValue, $array2[$mKey]);
if (count($aRecursiveDiff)) {
$return[$mKey] = $aRecursiveDiff;
}
} else {
if ($mValue != $array2[$mKey]) {
$return[$mKey] = $mValue;
}
}
} else {
$return[$mKey] = $mValue;
}
}
return $return;
}
Описание функции:
cot_arrayDiff(array $array1, array $array2)
Параметры:
$array1 (array) — первый массив, с которым будет выполняться сравнение.$array2 (array) — второй массив, с которым будет выполняться сравнение.
Логика работы:
Инициализация возвращаемого массива:
$return = [] — создается пустой массив для хранения элементов, которые присутствуют в $array1, но отсутствуют в $array2.
Перебор элементов первого массива:
foreach ($array1 as $mKey => $mValue) — цикл проходит по каждому элементу массива $array1, где $mKey — это ключ, а $mValue — значение элемента.
Проверка наличия ключа в массиве $array2:
if (array_key_exists($mKey, $array2)) — если текущий ключ из $array1 существует в $array2, то продолжаем проверку. Если ключ не найден, то просто добавляем этот элемент в массив $return.
Рекурсивная проверка для вложенных массивов:
Если значение элемента в $array1 является массивом, то вызываем рекурсивно cot_arrayDiff для сравнения вложенных массивов:
$aRecursiveDiff = cot_arrayDiff($mValue, $array2[$mKey]);
if (count($aRecursiveDiff)) {
$return[$mKey] = $aRecursiveDiff;
}
Если после рекурсивного сравнения есть отличия (разница), они добавляются в результат.
Сравнение значений для одномерных элементов:
Если значения в текущем элементе не совпадают между двумя массивами, то добавляем этот элемент в $return:
if ($mValue != $array2[$mKey]) {
$return[$mKey] = $mValue;
}
Добавление элементов, которых нет во втором массиве:
Если элемент с текущим ключом не существует в $array2, то добавляем его в результат:
$return[$mKey] = $mValue;
Возвращение результата:
Функция возвращает массив $return, который содержит все элементы из $array1, которые отсутствуют в $array2.
Пример работы функции:
$configDiff = cot_arrayDiff($new_cfg, $old_cfg);
$dbDiff = cot_arrayDiff($new_db, $old_db);
$array1 = [
'a' => 1,
'b' => 2,
'c' => ['x' => 10, 'y' => 20]
];
$array2 = [
'a' => 1,
'b' => 3,
'c' => ['x' => 10, 'y' => 25]
];
$result = cot_arrayDiff($array1, $array2); print_r($result);
Результат:
Array
(
[b] => 2
[c] => Array
(
[y] => 20
)
)
Резюме:
Функция cot_arrayDiff сравнивает два массива и рекурсивно находит разницу между ними, даже если массивы многомерные.
Она проверяет ключи и значения, добавляя в результат только те элементы, которые присутствуют в первом массиве, но отсутствуют во втором, или отличаются по значениям.
Это расширенная версия array_diff, которая поддерживает работу с многомерными массивами.
Комментарии (0)
Автор контента
Оффлайн
Administrator
Последняя авторизация: 05.07.2026 18:32
- Страница размещена: 21.01.2025 12:18
- Последнее обновление: 21.01.2025 12:18