orion122/diff-finder

View on GitHub
src/buildAST.php

Summary

Maintainability
A
1 hr
Test Coverage
<?php

namespace DiffFinder\buildAST;

use function \Funct\Collection\union;

function buildAST($array1, $array2)
{
    $unionArraysKeys = union(array_keys($array1), array_keys($array2));

    return array_reduce($unionArraysKeys, function ($acc, $key) use ($array1, $array2) {
        if (array_key_exists($key, $array1) && array_key_exists($key, $array2)) {
            if (is_array($array1[$key]) && is_array($array2[$key])) {
                if ($array1[$key] === $array2[$key]) {
                    $acc[] = buildArray($key, 'nested', $array1[$key]);
                } else {
                    $acc[] = buildArray($key, 'nested', buildAST($array1[$key], $array2[$key]));
                }
            } else {
                if ($array1[$key] === $array2[$key]) {
                    $acc[] = buildArray($key, 'unchanged', null, $array1[$key]);
                } else {
                    $acc[] = buildArray($key, 'changed', null, $array1[$key], $array2[$key]);
                }
            }
        } elseif (array_key_exists($key, $array1)) {
            if (is_array($array1[$key])) {
                $acc[] = buildArray($key, 'removed', null, $array1[$key]);
            } else {
                $acc[] = buildArray($key, 'removed', null, $array1[$key]);
            }
        } elseif (is_array($array2[$key])) {
            $acc[] = buildArray($key, 'added', null, $array2[$key]);
        } else {
            $acc[] = buildArray($key, 'added', null, $array2[$key]);
        }
        return $acc;
    }, []);
}


function buildArray($key, $type, $children, $from = null, $to = null)
{
    if ($type === 'nested') {
        return [
            'key'        => $key,
            'type'       => $type,
            'children'   => $children
        ];
    }

    return [
        'key'        => $key,
        'type'       => $type,
        'from'       => $from,
        'to'         => $to
    ];
}