making deep set/get possible using dot notation
This commit is contained in:
42
readme.md
42
readme.md
@ -1,13 +1,13 @@
|
|||||||
Ary
|
Ary
|
||||||
===
|
===
|
||||||
Are you tired from casting objects and arrays to each other? Don't do that anymore! Ary is a light class/function that makes accessing array items more convenient.
|
|
||||||
|
Are you tired from casting objects and arrays to each other or are bored using is `isset`? Don't do those anymore!
|
||||||
|
Ary is a light class/function that makes accessing array items more convenient.
|
||||||
|
|
||||||
1. You can access array items using `->` or `['']` syntax.
|
1. You can access array items using `->` or `['']` syntax.
|
||||||
2. You will get `null` if an index does not exists (instead of a nasty notification!)
|
2. You will get `null` if an index does not exists (instead of a nasty notification!)
|
||||||
3. You can specify a default value for missing indexes.
|
3. You can specify a default value for missing indexes.
|
||||||
|
4. You can set/get a value within a deeply nested array using "dot" notation.
|
||||||
* The class (`Ary()`) requires PHP 5.4 or newer.
|
|
||||||
* The helper function (`ary()`) requires PHP 5.6 or newer.
|
|
||||||
|
|
||||||
Examples
|
Examples
|
||||||
--------
|
--------
|
||||||
@ -17,30 +17,42 @@ $ary = new Ary();
|
|||||||
// or simply
|
// or simply
|
||||||
$ary = ary();
|
$ary = ary();
|
||||||
|
|
||||||
//setting and getting array items.
|
//Initialization
|
||||||
|
$ary = ary(2, 4, 6, 8); // or
|
||||||
$ary = ary(2, 4, 6, 8); //or
|
|
||||||
$ary = ary([2, 4, 6, 8]);
|
$ary = ary([2, 4, 6, 8]);
|
||||||
|
|
||||||
$ary = ary(['x' => 'foo', 'y' => 'bar']);
|
$ary = ary(['x' => 'foo', 'y' => 'bar']);
|
||||||
$foo = $ary->x; //or
|
|
||||||
$foo = $ary['x'];
|
|
||||||
|
|
||||||
$missed = $ary->get('missed', 'Default value');
|
|
||||||
|
|
||||||
|
//Assignment;
|
||||||
$ary->newItem=20; //or
|
$ary->newItem=20; //or
|
||||||
$ary['newItem']=20;
|
$ary['newItem']=20;
|
||||||
|
|
||||||
count($ary); //returns 3
|
//Retrieval
|
||||||
$ary->all(); // returns simple php array;
|
$foo = $ary->x; //or
|
||||||
~~~~~~
|
$foo = $ary['x'];
|
||||||
|
$missed = $ary->get('missed', 'Default value');
|
||||||
|
$ary->all(); // returns the simple php array;
|
||||||
|
|
||||||
|
// behave similar to regular arrays
|
||||||
|
count($ary); //returns 3
|
||||||
|
unset($ary[0]);
|
||||||
|
|
||||||
|
// deep assignment/retrieval
|
||||||
|
$ary = ary(['products' => ['desk' => ['price' => 100]]]);
|
||||||
|
$value = $ary['products.desk.price']; //100
|
||||||
|
$ary['production.table.weight']=200;
|
||||||
|
|
||||||
|
~~~~~~
|
||||||
|
|
||||||
Installation
|
Installation
|
||||||
============
|
============
|
||||||
|
Simply, `include '__DIR__.'/src/helper.php';`
|
||||||
|
|
||||||
|
or using Composer:
|
||||||
|
|
||||||
composer require salarmehr/ary
|
composer require salarmehr/ary
|
||||||
|
|
||||||
|
* The class (`Ary()`) requires PHP 5.4 or newer.
|
||||||
|
* The helper function (`ary()`) requires PHP 5.6 or newer.
|
||||||
|
|
||||||
Licence
|
Licence
|
||||||
=======
|
=======
|
||||||
|
33
src/Ary.php
33
src/Ary.php
@ -97,7 +97,16 @@ class Ary implements ArrayAccess, Countable, IteratorAggregate, JsonSerializable
|
|||||||
if ($this->offsetExists($key)) {
|
if ($this->offsetExists($key)) {
|
||||||
return $this->items[$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)) {
|
if (is_null($key)) {
|
||||||
$this->items[] = $value;
|
$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;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -61,6 +61,9 @@ class Test extends PHPUnit_Framework_TestCase
|
|||||||
{
|
{
|
||||||
$ary = new Ary();
|
$ary = new Ary();
|
||||||
$this->assertEquals($ary[0], null);
|
$this->assertEquals($ary[0], null);
|
||||||
|
|
||||||
|
$ary = new Ary(['x' => ['xx' => ['m' => 'xxx']]]);
|
||||||
|
$this->assertEquals($ary->get('x.xx.m'), 'xxx');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user