From b9f295e67b36d76906f75cc19b83b269f5002378 Mon Sep 17 00:00:00 2001 From: David Buchmann Date: Thu, 19 Jul 2018 11:29:45 +0200 Subject: [PATCH] src or dst can be null --- src/JsonPatch.php | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/src/JsonPatch.php b/src/JsonPatch.php index f77192c..f134348 100644 --- a/src/JsonPatch.php +++ b/src/JsonPatch.php @@ -290,17 +290,17 @@ private static function diff_values($path, $value, $other) // Walk associative arrays $src and $dst, returning a list of patches private static function diff_assoc($path, $src, $dst) { - $result = array(); - if (count($src) == 0 && count($dst) != 0) + if ((!is_array($src) || count($src)) == 0 && is_array($dst) && count($dst) != 0) { - $result[] = array("op" => "replace", "path" => "$path", "value" => $dst); + return array(array("op" => "replace", "path" => "$path", "value" => $dst)); } - else - { + + $result = array(); + if (is_array($src)) { foreach (array_keys($src) as $key) { $ekey = self::escape_pointer_part($key); - if (!array_key_exists($key, $dst)) + if (!is_array($dst) || !array_key_exists($key, $dst)) { $result[] = array("op" => "remove", "path" => "$path/$ekey"); } @@ -311,9 +311,11 @@ private static function diff_assoc($path, $src, $dst) $src[$key], $dst[$key])); } } + } + if (is_array($dst)) { foreach (array_keys($dst) as $key) { - if (!array_key_exists($key, $src)) + if (!is_array($src) || !array_key_exists($key, $src)) { $ekey = self::escape_pointer_part($key); $result[] = array("op" => "add", "path" => "$path/$ekey", @@ -337,7 +339,7 @@ private static function diff_array($path, $src, $dst) $i = $max - 1; while ($i >= 0) // equivalent for loop didn't work? { - if ($i < $lsrc && $i < $ldst && + if ($i < $lsrc && $i < $ldst && array_key_exists($i, $src) && array_key_exists($i, $dst)) { $result = array_merge($result,