From 2481b53dc5fad55505632869d1f23b516a2e12b3 Mon Sep 17 00:00:00 2001 From: GuangHa Date: Fri, 12 Mar 2021 16:13:12 +0100 Subject: [PATCH 01/12] Test --- src/JWadhams/JsonLogic.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/JWadhams/JsonLogic.php b/src/JWadhams/JsonLogic.php index c8277fe..33d9172 100644 --- a/src/JWadhams/JsonLogic.php +++ b/src/JWadhams/JsonLogic.php @@ -421,4 +421,9 @@ public static function add_operation($name, $callable) { self::$custom_operations[$name] = $callable; } + + public static function test_function() + { + return true; + } } From 7d31de75c477a96fc3651e95c5d4231900a4f7ee Mon Sep 17 00:00:00 2001 From: GuangHa Date: Thu, 15 Apr 2021 22:47:36 +0200 Subject: [PATCH 02/12] Add cartesian, modify, remove Add cumulative appliance --- src/JWadhams/JsonLogic.php | 54 ++++++++++++++++++++++++++++++++++---- 1 file changed, 49 insertions(+), 5 deletions(-) diff --git a/src/JWadhams/JsonLogic.php b/src/JWadhams/JsonLogic.php index 33d9172..fa1e7b7 100644 --- a/src/JWadhams/JsonLogic.php +++ b/src/JWadhams/JsonLogic.php @@ -40,7 +40,7 @@ public static function truthy($logic) return (bool)$logic; } - public static function apply($logic = [], $data = []) + public static function apply($logic = [], $data = [], $cumulative = false, $recursive = true) { //I'd rather work with array syntax if (is_object($logic)) { @@ -49,6 +49,18 @@ public static function apply($logic = [], $data = []) if (! self::is_logic($logic)) { if (is_array($logic)) { + if ($cumulative) { + $modifiedData = $data; + $count = 0; + foreach($logic as $rule) { + $modifiedData = self::apply($rule, $modifiedData); + $count++; + if (!is_array($modifiedData)) { + return 'Rule #'.$count.' does not return objects!'; + } + } + return $modifiedData; + } //Could be an array of logic statements. Only one way to find out. return array_map(function ($l) use ($data) { return self::apply($l, $data); @@ -208,6 +220,42 @@ public static function apply($logic = [], $data = []) }, 'substr' => function () { return call_user_func_array('substr', func_get_args()); + }, + 'cartesian' => function ($a, $b) use ($recursive) { + if ($recursive) { + $result = array(); + if (is_array($a) && is_array($b)) { + foreach ($a as $itemA) { + foreach ($a as $itemB) { + $res = array_merge([$itemA], [$itemB]); + $result[] = $res; + } + } + } + return $result; + } else { + return $a; + } + }, + 'modify' => function ($a, $b, $c) { + if (is_object($a)) { + $a->{$b} = $c; + } else { + foreach ($a as $item) { + $item->{$b} = $c; + } + } + return $a; + }, + 'remove' => function ($a, $b) { + if (is_object($a)) { + unset($a->{$b}); + } else { + foreach ($a as $item) { + unset($item->{$b}); + } + } + return $a; } ]; @@ -422,8 +470,4 @@ public static function add_operation($name, $callable) self::$custom_operations[$name] = $callable; } - public static function test_function() - { - return true; - } } From 8e92513517cc78b542a27ec8c8febce3c727754a Mon Sep 17 00:00:00 2001 From: GuangHa Date: Sun, 18 Apr 2021 14:19:30 +0200 Subject: [PATCH 03/12] Add originaldata, extend var, add group function, skip in cartesion and filter the recursion --- src/JWadhams/JsonLogic.php | 37 ++++++++++++++++++++++++++++--------- 1 file changed, 28 insertions(+), 9 deletions(-) diff --git a/src/JWadhams/JsonLogic.php b/src/JWadhams/JsonLogic.php index fa1e7b7..898b8c7 100644 --- a/src/JWadhams/JsonLogic.php +++ b/src/JWadhams/JsonLogic.php @@ -40,7 +40,7 @@ public static function truthy($logic) return (bool)$logic; } - public static function apply($logic = [], $data = [], $cumulative = false, $recursive = true) + public static function apply($logic = [], $data = [], $cumulative = false, $recursive = true, $originalData = []) { //I'd rather work with array syntax if (is_object($logic)) { @@ -53,11 +53,11 @@ public static function apply($logic = [], $data = [], $cumulative = false, $recu $modifiedData = $data; $count = 0; foreach($logic as $rule) { - $modifiedData = self::apply($rule, $modifiedData); + $modifiedData = self::apply($rule, $modifiedData, $cumulative, $recursive, $originalData); $count++; - if (!is_array($modifiedData)) { - return 'Rule #'.$count.' does not return objects!'; - } +// if (!is_array($modifiedData) && !is_object($modifiedData)) { +// return 'Rule #'.$count.' does not return objects!'; +// } } return $modifiedData; } @@ -130,10 +130,14 @@ public static function apply($logic = [], $data = [], $cumulative = false, $recu error_log($a); return $a; }, - 'var' => function ($a = null, $default = null) use ($data) { - if ($a === null or $a === "") { + 'var' => function ($a = null, $default = null, $useOriginalData = false) use ($data, $recursive, $originalData) { + if ($useOriginalData) { + return $originalData; + } + if ($a === null or $a === "" or !$recursive) { return $data; } + //Descending into data using dot-notation //This is actually safe for integer indexes, PHP treats $a["1"] exactly like $a[1] foreach (explode('.', $a) as $prop) { @@ -239,10 +243,14 @@ public static function apply($logic = [], $data = [], $cumulative = false, $recu }, 'modify' => function ($a, $b, $c) { if (is_object($a)) { +// if (property_exists($a, $b)) { $a->{$b} = $c; +// } } else { foreach ($a as $item) { +// if (is_object($item) && property_exists($item, $b)) { $item->{$b} = $c; +// } } } return $a; @@ -256,6 +264,14 @@ public static function apply($logic = [], $data = [], $cumulative = false, $recu } } return $a; + }, + 'group' => function ($a, $b, $ignoreRecursive = false) use ($recursive) { + if ($recursive || $ignoreRecursive) { + $group[$b] = $a; + return $group; + } else { + return $a; + } } ]; @@ -293,6 +309,9 @@ public static function apply($logic = [], $data = [], $cumulative = false, $recu } return null; } elseif ($op === "filter") { + if (!$recursive) { + return $data; + } $scopedData = static::apply($values[0], $data); $scopedLogic = $values[1]; @@ -368,8 +387,8 @@ function ($accumulator, $current) use ($scopedLogic) { } //Recursion! - $values = array_map(function ($value) use ($data) { - return self::apply($value, $data); + $values = array_map(function ($value) use ($data, $recursive, $originalData) { + return self::apply($value, $data, false, $recursive, $originalData); }, $values); return call_user_func_array($operation, $values); From a754f84422eeb3d418d6b1120383cd3a57f64eda Mon Sep 17 00:00:00 2001 From: GuangHa Date: Wed, 21 Apr 2021 22:15:58 +0200 Subject: [PATCH 04/12] Add sqrt and join function --- src/JWadhams/JsonLogic.php | 34 ++++++++++++++++++++++------------ 1 file changed, 22 insertions(+), 12 deletions(-) diff --git a/src/JWadhams/JsonLogic.php b/src/JWadhams/JsonLogic.php index 898b8c7..2fd07cf 100644 --- a/src/JWadhams/JsonLogic.php +++ b/src/JWadhams/JsonLogic.php @@ -272,6 +272,16 @@ public static function apply($logic = [], $data = [], $cumulative = false, $recu } else { return $a; } + }, + 'sqrt' => function($a) { + return sqrt($a); + }, + 'join' => function() { + $joinedArray = []; + foreach(func_get_args() as $argument) { + $joinedArray[] = $argument; + } + return $joinedArray; } ]; @@ -300,19 +310,19 @@ public static function apply($logic = [], $data = [], $cumulative = false, $recu given 0 parameters, return NULL (not great practice, but there was no Else) */ for ($i = 0 ; $i < count($values) - 1 ; $i += 2) { - if (static::truthy(static::apply($values[$i], $data))) { - return static::apply($values[$i+1], $data); + if (static::truthy(static::apply($values[$i], $data, false, true, $originalData))) { + return static::apply($values[$i+1], $data, false, true, $originalData); } } if (count($values) === $i+1) { - return static::apply($values[$i], $data); + return static::apply($values[$i], $data, false, true, $originalData); } return null; } elseif ($op === "filter") { if (!$recursive) { return $data; } - $scopedData = static::apply($values[0], $data); + $scopedData = static::apply($values[0], $data, false, true, $originalData); $scopedLogic = $values[1]; if (!$scopedData || !is_array($scopedData)) { @@ -322,12 +332,12 @@ public static function apply($logic = [], $data = [], $cumulative = false, $recu // that return truthy when passed to the logic in the second argument. // For parity with JavaScript, reindex the returned array return array_values( - array_filter($scopedData, function ($datum) use ($scopedLogic) { - return static::truthy(static::apply($scopedLogic, $datum)); + array_filter($scopedData, function ($datum) use ($scopedLogic, $originalData) { + return static::truthy(static::apply($scopedLogic, $datum, false, true, $originalData)); }) ); } elseif ($op === "map") { - $scopedData = static::apply($values[0], $data); + $scopedData = static::apply($values[0], $data, false, true, $originalData); $scopedLogic = $values[1]; if (!$scopedData || !is_array($scopedData)) { @@ -335,13 +345,13 @@ public static function apply($logic = [], $data = [], $cumulative = false, $recu } return array_map( - function ($datum) use ($scopedLogic) { - return static::apply($scopedLogic, $datum); + function ($datum) use ($scopedLogic, $originalData) { + return static::apply($scopedLogic, $datum, false, true, $originalData); }, $scopedData ); } elseif ($op === "reduce") { - $scopedData = static::apply($values[0], $data); + $scopedData = static::apply($values[0], $data, false, true, $originalData); $scopedLogic = $values[1]; $initial = isset($values[2]) ? $values[2] : null; @@ -351,10 +361,10 @@ function ($datum) use ($scopedLogic) { return array_reduce( $scopedData, - function ($accumulator, $current) use ($scopedLogic) { + function ($accumulator, $current) use ($scopedLogic, $originalData) { return static::apply( $scopedLogic, - ['current'=>$current, 'accumulator'=>$accumulator] + ['current'=>$current, 'accumulator'=>$accumulator], false, true, $originalData ); }, $initial From db9289ce9b039082043fd0d3dbd9db1587fa294a Mon Sep 17 00:00:00 2001 From: GuangHa Date: Thu, 22 Apr 2021 19:56:44 +0200 Subject: [PATCH 05/12] Add create function --- src/JWadhams/JsonLogic.php | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/JWadhams/JsonLogic.php b/src/JWadhams/JsonLogic.php index 2fd07cf..033b38e 100644 --- a/src/JWadhams/JsonLogic.php +++ b/src/JWadhams/JsonLogic.php @@ -282,6 +282,27 @@ public static function apply($logic = [], $data = [], $cumulative = false, $recu $joinedArray[] = $argument; } return $joinedArray; + }, + 'create' => function() use ($recursive) { + $data = func_get_arg(0); + if ($recursive) { + $argumentNumber = 0; + $object = new \stdClass(); + foreach (func_get_args() as $argument) { + $argumentNumber++; + if ($argumentNumber == 1) { + continue; + } + + // key and value => size = 2 + if (count($argument) == 2) { + $key = $argument[0]; + $object->$key = $argument[1]; + } + } + array_push($data, $object); + } + return $data; } ]; From e864148fac7cf92e00e6bfd1c758cb93889bc7bc Mon Sep 17 00:00:00 2001 From: GuangHa Date: Sun, 25 Apr 2021 20:52:50 +0200 Subject: [PATCH 06/12] Add delete function --- src/JWadhams/JsonLogic.php | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/JWadhams/JsonLogic.php b/src/JWadhams/JsonLogic.php index 033b38e..6015e62 100644 --- a/src/JWadhams/JsonLogic.php +++ b/src/JWadhams/JsonLogic.php @@ -276,7 +276,10 @@ public static function apply($logic = [], $data = [], $cumulative = false, $recu 'sqrt' => function($a) { return sqrt($a); }, - 'join' => function() { + 'join' => function() use ($data, $recursive) { + if (!$recursive) { + return $data; + } $joinedArray = []; foreach(func_get_args() as $argument) { $joinedArray[] = $argument; @@ -303,6 +306,15 @@ public static function apply($logic = [], $data = [], $cumulative = false, $recu array_push($data, $object); } return $data; + }, + 'delete' => function($a, $b, $c) { + $result = []; + foreach ($a as $key => $item) { + if (!property_exists($item, $b) || $item->$b != $c) { + $result[] = $item; + } + } + return $result; } ]; From 5a005de4f62358df87041b377e1abcb1f6aa166c Mon Sep 17 00:00:00 2001 From: GuangHa Date: Tue, 27 Apr 2021 21:40:32 +0200 Subject: [PATCH 07/12] Fix single rules for using original data --- src/JWadhams/JsonLogic.php | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/JWadhams/JsonLogic.php b/src/JWadhams/JsonLogic.php index 6015e62..7a6f217 100644 --- a/src/JWadhams/JsonLogic.php +++ b/src/JWadhams/JsonLogic.php @@ -62,8 +62,8 @@ public static function apply($logic = [], $data = [], $cumulative = false, $recu return $modifiedData; } //Could be an array of logic statements. Only one way to find out. - return array_map(function ($l) use ($data) { - return self::apply($l, $data); + return array_map(function ($l) use ($data, $originalData) { + return self::apply($l, $data, false, true, $originalData); }, $logic); } else { return $logic; @@ -289,6 +289,9 @@ public static function apply($logic = [], $data = [], $cumulative = false, $recu 'create' => function() use ($recursive) { $data = func_get_arg(0); if ($recursive) { + if (empty($data)) { + $data = []; + } $argumentNumber = 0; $object = new \stdClass(); foreach (func_get_args() as $argument) { From 16f883de556bbc2dd829124655f278b57141a3d4 Mon Sep 17 00:00:00 2001 From: GuangHa Date: Thu, 29 Apr 2021 20:22:37 +0200 Subject: [PATCH 08/12] Disable cumulative inside the rules, add rounding to sqrt --- src/JWadhams/JsonLogic.php | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/JWadhams/JsonLogic.php b/src/JWadhams/JsonLogic.php index 7a6f217..bc6c534 100644 --- a/src/JWadhams/JsonLogic.php +++ b/src/JWadhams/JsonLogic.php @@ -53,11 +53,8 @@ public static function apply($logic = [], $data = [], $cumulative = false, $recu $modifiedData = $data; $count = 0; foreach($logic as $rule) { - $modifiedData = self::apply($rule, $modifiedData, $cumulative, $recursive, $originalData); + $modifiedData = self::apply($rule, $modifiedData, false, $recursive, $originalData); $count++; -// if (!is_array($modifiedData) && !is_object($modifiedData)) { -// return 'Rule #'.$count.' does not return objects!'; -// } } return $modifiedData; } @@ -200,6 +197,9 @@ public static function apply($logic = [], $data = [], $cumulative = false, $recu return min(func_get_args()); }, '+' => function () { + if (is_array(func_get_arg(0))) { + return array_sum(func_get_arg(0)); + } return array_sum(func_get_args()); }, '-' => function ($a, $b=null) { @@ -273,7 +273,10 @@ public static function apply($logic = [], $data = [], $cumulative = false, $recu return $a; } }, - 'sqrt' => function($a) { + 'sqrt' => function($a, $precision = null) { + if (!is_null($precision) && is_numeric($precision)) { + return round(sqrt($a), $precision); + } return sqrt($a); }, 'join' => function() use ($data, $recursive) { From edc804a63be823d1ccad4eacd6639b7a9519a80d Mon Sep 17 00:00:00 2001 From: GuangHa Date: Sat, 1 May 2021 03:21:45 +0200 Subject: [PATCH 09/12] Fix var, expand missing to allow search in passed data, expand modify to handle objects and arrays without needing to put the key in dot-syntax, add count function --- src/JWadhams/JsonLogic.php | 130 +++++++++++++++++++++++++++---------- 1 file changed, 94 insertions(+), 36 deletions(-) diff --git a/src/JWadhams/JsonLogic.php b/src/JWadhams/JsonLogic.php index bc6c534..a7f8722 100644 --- a/src/JWadhams/JsonLogic.php +++ b/src/JWadhams/JsonLogic.php @@ -127,11 +127,11 @@ public static function apply($logic = [], $data = [], $cumulative = false, $recu error_log($a); return $a; }, - 'var' => function ($a = null, $default = null, $useOriginalData = false) use ($data, $recursive, $originalData) { + 'var' => function ($a = null, $default = null, $useOriginalData = false) use ($data, $originalData) { if ($useOriginalData) { - return $originalData; + $data = $originalData; } - if ($a === null or $a === "" or !$recursive) { + if ($a === null or $a === "") { return $data; } @@ -155,9 +155,14 @@ public static function apply($logic = [], $data = [], $cumulative = false, $recu which typically happens if it's actually acting on the output of another command (like IF or MERGE) */ - $values = func_get_args(); - if (!static::is_logic($values) and isset($values[0]) and is_array($values[0])) { - $values = $values[0]; + if (is_bool(func_get_arg(0)) && func_num_args() > 1) { + $data = func_get_arg(1); + $values = func_get_arg(2); + } else { + $values = func_get_args(); + if (!static::is_logic($values) and isset($values[0]) and is_array($values[0])) { + $values = $values[0]; + } } $missing = []; @@ -242,15 +247,64 @@ public static function apply($logic = [], $data = [], $cumulative = false, $recu } }, 'modify' => function ($a, $b, $c) { + $properties = explode('.', $b); if (is_object($a)) { -// if (property_exists($a, $b)) { - $a->{$b} = $c; -// } + if (count($properties) > 1) { + $data = $a; + foreach ($properties as $key => $prop) { + if ($key !== array_key_last($properties)) { + if (is_object($data) && property_exists($data, $prop)) { + $data = $data->{$prop}; + } else { + if (array_key_exists($prop, $data)) { + $data = $data[$prop]; + } + } + } + } + if (is_array($data)) { + $newData = []; + foreach ($data as $entry) { + $entry->{end($properties)} = $c; + $newData[] = $entry; + } + } else { + $data->{end($properties)} = $c; + $newData = $data; + } + $a->{reset($properties)} = $newData; + } else { + $a->{$b} = $c; + } } else { - foreach ($a as $item) { -// if (is_object($item) && property_exists($item, $b)) { - $item->{$b} = $c; -// } + foreach ($a as $mainkey => $item) { + if (count($properties) > 1) { + $data = $item; + foreach ($properties as $key => $prop) { + if ($key !== array_key_last($properties)) { + if (is_object($data) && property_exists($data, $prop)) { + $data = $data->{$prop}; + } else { + if (array_key_exists($prop, $data)) { + $data = $data[$prop]; + } + } + } + } + if (is_array($data)) { + $newData = []; + foreach ($data as $entry) { + $entry->{end($properties)} = $c; + $newData[] = $entry; + } + } else { + $data->{end($properties)} = $c; + $newData = $data; + } + $item->{reset($properties)} = $newData; + } else { + $item->{$b} = $c; + } } } return $a; @@ -266,12 +320,12 @@ public static function apply($logic = [], $data = [], $cumulative = false, $recu return $a; }, 'group' => function ($a, $b, $ignoreRecursive = false) use ($recursive) { - if ($recursive || $ignoreRecursive) { - $group[$b] = $a; - return $group; - } else { - return $a; - } +// if ($recursive || $ignoreRecursive) { + $group[$b] = $a; + return $group; +// } else { +// return $a; +// } }, 'sqrt' => function($a, $precision = null) { if (!is_null($precision) && is_numeric($precision)) { @@ -289,28 +343,26 @@ public static function apply($logic = [], $data = [], $cumulative = false, $recu } return $joinedArray; }, - 'create' => function() use ($recursive) { + 'create' => function() { $data = func_get_arg(0); - if ($recursive) { - if (empty($data)) { - $data = []; + if (empty($data)) { + $data = []; + } + $argumentNumber = 0; + $object = new \stdClass(); + foreach (func_get_args() as $argument) { + $argumentNumber++; + if ($argumentNumber == 1) { + continue; } - $argumentNumber = 0; - $object = new \stdClass(); - foreach (func_get_args() as $argument) { - $argumentNumber++; - if ($argumentNumber == 1) { - continue; - } - // key and value => size = 2 - if (count($argument) == 2) { - $key = $argument[0]; - $object->$key = $argument[1]; - } + // key and value => size = 2 + if (count($argument) == 2) { + $key = $argument[0]; + $object->$key = $argument[1]; } - array_push($data, $object); } + array_push($data, $object); return $data; }, 'delete' => function($a, $b, $c) { @@ -321,6 +373,12 @@ public static function apply($logic = [], $data = [], $cumulative = false, $recu } } return $result; + }, + 'count' => function($a) { + if (is_array($a)) { + return count($a); + } + return 1; } ]; From 7d146465e477e90fbc95d79bf2073f7c919e037d Mon Sep 17 00:00:00 2001 From: GuangHa Date: Sat, 1 May 2021 14:45:11 +0200 Subject: [PATCH 10/12] Updated join function for handling arrays, removed comments --- src/JWadhams/JsonLogic.php | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/src/JWadhams/JsonLogic.php b/src/JWadhams/JsonLogic.php index a7f8722..ddacf65 100644 --- a/src/JWadhams/JsonLogic.php +++ b/src/JWadhams/JsonLogic.php @@ -320,12 +320,8 @@ public static function apply($logic = [], $data = [], $cumulative = false, $recu return $a; }, 'group' => function ($a, $b, $ignoreRecursive = false) use ($recursive) { -// if ($recursive || $ignoreRecursive) { $group[$b] = $a; return $group; -// } else { -// return $a; -// } }, 'sqrt' => function($a, $precision = null) { if (!is_null($precision) && is_numeric($precision)) { @@ -333,13 +329,14 @@ public static function apply($logic = [], $data = [], $cumulative = false, $recu } return sqrt($a); }, - 'join' => function() use ($data, $recursive) { - if (!$recursive) { - return $data; - } + 'join' => function() use ($data) { $joinedArray = []; foreach(func_get_args() as $argument) { - $joinedArray[] = $argument; + if (is_array($argument)) { + $joinedArray = array_merge($joinedArray, $argument); + } else { + $joinedArray[] = $argument; + } } return $joinedArray; }, From 07d52a86f9761b398de03414edf8c02d488f7cbf Mon Sep 17 00:00:00 2001 From: GuangHa Date: Thu, 6 May 2021 23:13:47 +0200 Subject: [PATCH 11/12] Remove recursion from json logic --- src/JWadhams/JsonLogic.php | 53 +++++++++++++++++--------------------- 1 file changed, 23 insertions(+), 30 deletions(-) diff --git a/src/JWadhams/JsonLogic.php b/src/JWadhams/JsonLogic.php index ddacf65..99afe0e 100644 --- a/src/JWadhams/JsonLogic.php +++ b/src/JWadhams/JsonLogic.php @@ -40,7 +40,7 @@ public static function truthy($logic) return (bool)$logic; } - public static function apply($logic = [], $data = [], $cumulative = false, $recursive = true, $originalData = []) + public static function apply($logic = [], $data = [], $cumulative = false, $originalData = []) { //I'd rather work with array syntax if (is_object($logic)) { @@ -53,14 +53,14 @@ public static function apply($logic = [], $data = [], $cumulative = false, $recu $modifiedData = $data; $count = 0; foreach($logic as $rule) { - $modifiedData = self::apply($rule, $modifiedData, false, $recursive, $originalData); + $modifiedData = self::apply($rule, $modifiedData, false, $originalData); $count++; } return $modifiedData; } //Could be an array of logic statements. Only one way to find out. return array_map(function ($l) use ($data, $originalData) { - return self::apply($l, $data, false, true, $originalData); + return self::apply($l, $data, false, $originalData); }, $logic); } else { return $logic; @@ -230,21 +230,17 @@ public static function apply($logic = [], $data = [], $cumulative = false, $recu 'substr' => function () { return call_user_func_array('substr', func_get_args()); }, - 'cartesian' => function ($a, $b) use ($recursive) { - if ($recursive) { - $result = array(); - if (is_array($a) && is_array($b)) { - foreach ($a as $itemA) { - foreach ($a as $itemB) { - $res = array_merge([$itemA], [$itemB]); - $result[] = $res; - } + 'cartesian' => function ($a, $b) { + $result = array(); + if (is_array($a) && is_array($b)) { + foreach ($a as $itemA) { + foreach ($a as $itemB) { + $res = array_merge([$itemA], [$itemB]); + $result[] = $res; } } - return $result; - } else { - return $a; } + return $result; }, 'modify' => function ($a, $b, $c) { $properties = explode('.', $b); @@ -319,7 +315,7 @@ public static function apply($logic = [], $data = [], $cumulative = false, $recu } return $a; }, - 'group' => function ($a, $b, $ignoreRecursive = false) use ($recursive) { + 'group' => function ($a, $b) { $group[$b] = $a; return $group; }, @@ -404,19 +400,16 @@ public static function apply($logic = [], $data = [], $cumulative = false, $recu given 0 parameters, return NULL (not great practice, but there was no Else) */ for ($i = 0 ; $i < count($values) - 1 ; $i += 2) { - if (static::truthy(static::apply($values[$i], $data, false, true, $originalData))) { - return static::apply($values[$i+1], $data, false, true, $originalData); + if (static::truthy(static::apply($values[$i], $data, false, $originalData))) { + return static::apply($values[$i+1], $data, false, $originalData); } } if (count($values) === $i+1) { - return static::apply($values[$i], $data, false, true, $originalData); + return static::apply($values[$i], $data, false, $originalData); } return null; } elseif ($op === "filter") { - if (!$recursive) { - return $data; - } - $scopedData = static::apply($values[0], $data, false, true, $originalData); + $scopedData = static::apply($values[0], $data, false, $originalData); $scopedLogic = $values[1]; if (!$scopedData || !is_array($scopedData)) { @@ -427,11 +420,11 @@ public static function apply($logic = [], $data = [], $cumulative = false, $recu // For parity with JavaScript, reindex the returned array return array_values( array_filter($scopedData, function ($datum) use ($scopedLogic, $originalData) { - return static::truthy(static::apply($scopedLogic, $datum, false, true, $originalData)); + return static::truthy(static::apply($scopedLogic, $datum, false, $originalData)); }) ); } elseif ($op === "map") { - $scopedData = static::apply($values[0], $data, false, true, $originalData); + $scopedData = static::apply($values[0], $data, false, $originalData); $scopedLogic = $values[1]; if (!$scopedData || !is_array($scopedData)) { @@ -440,12 +433,12 @@ public static function apply($logic = [], $data = [], $cumulative = false, $recu return array_map( function ($datum) use ($scopedLogic, $originalData) { - return static::apply($scopedLogic, $datum, false, true, $originalData); + return static::apply($scopedLogic, $datum, false, $originalData); }, $scopedData ); } elseif ($op === "reduce") { - $scopedData = static::apply($values[0], $data, false, true, $originalData); + $scopedData = static::apply($values[0], $data, false, $originalData); $scopedLogic = $values[1]; $initial = isset($values[2]) ? $values[2] : null; @@ -458,7 +451,7 @@ function ($datum) use ($scopedLogic, $originalData) { function ($accumulator, $current) use ($scopedLogic, $originalData) { return static::apply( $scopedLogic, - ['current'=>$current, 'accumulator'=>$accumulator], false, true, $originalData + ['current'=>$current, 'accumulator'=>$accumulator], false, $originalData ); }, $initial @@ -491,8 +484,8 @@ function ($accumulator, $current) use ($scopedLogic, $originalData) { } //Recursion! - $values = array_map(function ($value) use ($data, $recursive, $originalData) { - return self::apply($value, $data, false, $recursive, $originalData); + $values = array_map(function ($value) use ($data, $originalData) { + return self::apply($value, $data, false, $originalData); }, $values); return call_user_func_array($operation, $values); From cb0d801a7dbd68b6b75e048f217e6f842ef8ff37 Mon Sep 17 00:00:00 2001 From: GuangHa Date: Sat, 15 May 2021 20:38:35 +0200 Subject: [PATCH 12/12] Add slice function, add option to use parameter-data for var function --- src/JWadhams/JsonLogic.php | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/JWadhams/JsonLogic.php b/src/JWadhams/JsonLogic.php index 99afe0e..77a0fec 100644 --- a/src/JWadhams/JsonLogic.php +++ b/src/JWadhams/JsonLogic.php @@ -127,10 +127,13 @@ public static function apply($logic = [], $data = [], $cumulative = false, $orig error_log($a); return $a; }, - 'var' => function ($a = null, $default = null, $useOriginalData = false) use ($data, $originalData) { + 'var' => function ($a = null, $default = null, $useOriginalData = false, $newData = []) use ($data, $originalData) { if ($useOriginalData) { $data = $originalData; } + if (!empty($newData)) { + $data = $newData; + } if ($a === null or $a === "") { return $data; } @@ -372,6 +375,9 @@ public static function apply($logic = [], $data = [], $cumulative = false, $orig return count($a); } return 1; + }, + 'slice' => function($array, $offset, $length) { + return array_slice($array, $offset, $length); } ];