Search by

lionser / array-diff

Lionser

Structural diff of nested arrays in field/old/new format

Package info

github.com/lionser/array-diff

pkg:composer/lionser/array-diff

Statistics

Installs: 11

Dependents: 0

Suggesters: 0

Stars: 0

Open Issues: 0

1.0.0 2026-10-20 10:20 UTC

This package is auto-updated.

Last update: 2026-10-20 10:22:36 UTC


README

Структурное сравнение вложенных массивов. Результат: список изменений в формате field / old / new.

Установка

composer require lionser/array-diff

Из приватного репозитория:

{
    "repositories": [
        { "type": "vcs", "url": "git@github.com:lionser/array-diff.git" }
    ]
}

Использование

use Lionser\ArrayDiff\ArrayDiffer;

$differ = new ArrayDiffer();

$changes = $differ->diffToArray(
    ['user' => ['name' => 'Ann', 'tags' => ['a', 'b']]],
    ['user' => ['name' => 'Bob', 'tags' => ['a', 'c']]],
);

Результат:

[
    ['field' => 'user.name', 'old' => 'Ann', 'new' => 'Bob'],
    ['field' => 'user.tags', 'old' => ['a', 'b'], 'new' => ['a', 'c']],
]

Метод diff() возвращает список объектов Change со свойствами field, old, new, hadOld, hasNew.

Разделитель пути задаётся в конструкторе:

$differ = new ArrayDiffer('/');

Семантика

  • ассоциативные массивы сравниваются рекурсивно по ключам;
  • списки (array_is_list) сравниваются целиком, одной записью;
  • пустой массив считается ассоциативным, поэтому [] → ['a' => 1] даёт запись a;
  • если с одной стороны ассоциативный массив, а с другой список или скаляр, возвращается одна запись для всего значения;
  • добавленный или удалённый ключ с массивом возвращается одной записью, без раскрытия внутрь;
  • значения сравниваются строго (===), 1 и '1' считаются разными;
  • null и отсутствующий ключ различаются через hadOld и hasNew, в toArray() оба дают null;
  • порядок записей: сначала ключи из $before, затем новые ключи из $after.

Разработка

composer install
composer test
composer stan