From 1722b8ba3095e6f217b968b4b8d19d7aafbc2557 Mon Sep 17 00:00:00 2001 From: Reza Date: Fri, 13 Nov 2015 08:13:11 +0330 Subject: [PATCH] making deep set/get possible using dot notation --- readme.md | 5 +++++ src/Ary.php | 33 ++++++++++++++++++++++++++++++--- test/Test.php | 3 +++ 3 files changed, 38 insertions(+), 3 deletions(-) diff --git a/readme.md b/readme.md index 2190791..aeb3d4c 100644 --- a/readme.md +++ b/readme.md @@ -33,6 +33,11 @@ $ary['newItem']=20; count($ary); //returns 3 $ary->all(); // returns simple php array; + +// deep assignment/retrieval +$ary = ary(['products' => ['desk' => ['price' => 100]]]); +$value = $ary['products.desk.price']; //100 +$ary['production.table.weight']=200; ~~~~~~ diff --git a/src/Ary.php b/src/Ary.php index db50e97..71df75e 100644 --- a/src/Ary.php +++ b/src/Ary.php @@ -97,7 +97,16 @@ class Ary implements ArrayAccess, Countable, IteratorAggregate, JsonSerializable if ($this->offsetExists($key)) { return $this->items[$key]; } - return $default; + + $array = $this->items; + foreach (explode('.', $key) as $segment) { + if (!is_array($array) || !array_key_exists($segment, $array)) { + return $default; + } + + $array = $array[$segment]; + } + return $array; } /** @@ -122,10 +131,28 @@ class Ary implements ArrayAccess, Countable, IteratorAggregate, JsonSerializable { if (is_null($key)) { $this->items[] = $value; + return; } - else { - $this->items[$key] = $value; + +// $this->items[$key] = $value; + + $keys = explode('.', $key); + $array =& $this->items; + while (count($keys) > 1) { + $key = array_shift($keys); + + // If the key doesn't exist at this depth, we will just create an empty array + // to hold the next value, allowing us to create the arrays to hold final + // values at the correct depth. Then we'll keep digging into the array. + if (!isset($array[$key]) || !is_array($array[$key])) { + $array[$key] = []; + } + + $array = &$array[$key]; } + + $array[array_shift($keys)] = $value; + return; } /** diff --git a/test/Test.php b/test/Test.php index f79145b..5a04d72 100644 --- a/test/Test.php +++ b/test/Test.php @@ -61,6 +61,9 @@ class Test extends PHPUnit_Framework_TestCase { $ary = new Ary(); $this->assertEquals($ary[0], null); + + $ary = new Ary(['x' => ['xx' => ['m' => 'xxx']]]); + $this->assertEquals($ary->get('x.xx.m'), 'xxx'); }