Функция 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, которая поддерживает работу с многомерными массивами.

3 минут чтения Administrator

Комментарии (0)

Комментарии отсутствуют
Добавление комментариев доступно только зарегистрированным пользователям

Автор контента

Administrator

Оффлайн

Administrator

Последняя авторизация: 05.07.2026 18:32

  • Страница размещена: 21.01.2025 12:18
  • Последнее обновление: 21.01.2025 12:18