lionser / array-diff
Structural diff of nested arrays in field/old/new format
1.0.0
2026-10-20 10:20 UTC
Requires
- php: >=8.1
Requires (Dev)
- phpstan/phpstan: ^1.11
- phpunit/phpunit: ^10.5
Suggests
None
Provides
None
Conflicts
None
Replaces
None
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