lev0607/php-project-lvl2

View on GitHub
src/buildDiff.php

Summary

Maintainability
B
4 hrs
Test Coverage
<?php

namespace Differ\buildDiff;

function buildDiff($before, $after)
{
    $keys = array_keys(array_merge($before, $after));
    $f = function ($key) use ($before, $after) {
        if (!array_key_exists($key, $before)) {
            return [
                "key" => $key,
                "value" => $after[$key],
                "type" => "added"
                ];
        }
        if (!array_key_exists($key, $after)) {
            return [
                "key" => $key,
                "value" => $before[$key],
                "type" => "deleted"
                ];
        }
        if (array_key_exists($key, $after) && array_key_exists($key, $before)) {
            if (is_array($before[$key]) && is_array($after[$key])) {
                return [
                    "key" => $key,
                    "children" => buildDiff($before[$key], $after[$key]),
                    "type" => "node"
                ];
            }

            if ($before[$key] === $after[$key]) {
                return [
                    "key" => $key,
                    "value" => $before[$key],
                    "type" => "unchanged"
                    ];
            }

            if ($before[$key] !== $after[$key]) {
                return [
                    "key" => $key,
                    "valueBefore" => $before[$key],
                    "valueAfter" => $after[$key],
                    "type" => "changed"
                    ];
            }
        }
    };
    return array_map($f, $keys);
}