[READ ONLY] Nested data structure storage object.
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
Format MISC fixes Jan 13, 2019
Test Fix test Jan 13, 2019
.gitignore Rename Registry to Structure Jul 3, 2016
.travis.yml Update package test Jan 13, 2019
Format.php Update all headers Dec 2, 2018
README.md Update README.md Jul 9, 2016
Structure.php Update all headers Dec 2, 2018
StructureHelper.php Update all headers Dec 2, 2018
composer.json update php limit Jan 13, 2019
phpunit.travis.xml Update phpunit.xml Jul 3, 2016
phpunit.xml.dist Update phpunit.xml Jul 3, 2016

README.md

Windwalker Structure

Windwalker Structure is a storage of nested array or object, help us manage multi-level structures data.

Installation via Composer

Add this to the require block in your composer.json.

{
    "require": {
        "windwalker/structure": "~3.0"
    }
}

Getting Started

use Windwalker\Structure\Structure;

$structure = new Structure;

// Set a value in the structure.
$structure->set('foo', 'bar');

// Get a value from the structure;
$value = $structure->get('foo');

Load config by Structure

use Windwalker\Structure\Structure;

$structure = new Structure;

// Load by string
$structure->loadString('{"foo" : "bar"}');

$structure->loadString('<root></root>', 'xml');

// Load by object or array
$structure->load($object);

// Load by file
$structure->loadFile($root . '/config/config.json', 'json');

Accessing a Structure by getter & setter

Get value

$structure->get('foo');

// Get a non-exists value and return default
$structure->get('foo', 'default');

// OR

$structure->get('foo') ?: 'default';

Set value

// Set value
$structure->set('bar', $value);

// Sets a default value if not already assigned.
$structure->def('bar', $default);

Accessing children value by path

$json = '{
	"parent" : {
		"child" : "Foo"
	}
}';

$structure = new Structure($json);

$structure->get('parent.child'); // return 'Foo'

$structure->set('parent.child', $value);

Append & Prepend

Support push / pop / shift / unshift methods.

$structure->set('foo.bar', array('fisrt', 'second'));

$structure->push('foo.bar', 'third');

$structure->get('foo.bar');
// Result: Array(first, second, third)

Use other separator

$structure->setSeparator('/');

$data = $structure->get('foo/bar');

Accessing a Structure as an Array

The Structure class implements ArrayAccess so the properties of the structure can be accessed as an array. Consider the following examples:

// Set a value in the structure.
$structure['foo'] = 'bar';

// Get a value from the structure;
$value = $structure['foo'];

// Check if a key in the structure is set.
if (isset($structure['foo']))
{
	echo 'Say bar.';
}

Merge Structure

Using load* methods to merge two config files.

$json1 = '{
    "field" : {
        "keyA" : "valueA",
        "keyB" : "valueB"
    }
}';

$json2 = '{
    "field" : {
        "keyB" : "a new valueB"
    }
}';

$structure->loadString($json1);
$structure->loadString($json2);

Output

Array(
    field => Array(
        keyA => valueA
        keyB => a new valueB
    )
)

Merge Another Structure

$object1 = '{
	"foo" : "foo value",
	"bar" : {
		"bar1" : "bar value 1",
		"bar2" : "bar value 2"
	}
}';

$object2 = '{
	"foo" : "foo value",
	"bar" : {
		"bar2" : "new bar value 2"
	}
}';

$structure1 = new Structure(json_decode($object1));
$structure2 = new Structure(json_decode($object2));

$structure1->merge($structure2);

If you just want to merge first level, do not hope recursive:

$structure1->merge($structure2, false); // Set param 2 to false that Structure will only merge first level

Merge to a child node:

$structure->mergeTo('foo.bar', $anotherStructure);

Dump to file.

$structure->toString();

$structure->toString('xml');

$structure->toString('ini');

Dump to one dimension

$array = array(
    'flower' => array(
        'sunflower' => 'light',
        'sakura' => 'samurai'
    )
);

$structure = new Structure($array);

// Make data to one dimension

$flatted = $structure->flatten();

print_r($flatted);

The result:

Array
(
    [flower.sunflower] => light
    [flower.sakura] => samurai
)

Using YAML

Add Symfony YAML component in composer.json

{
	"require-dev": {
		"symfony/yaml": "~3.0"
	}
}

Using yaml format

$structure->loadFile($yamlFile, 'yaml');

$structure->loadString('foo: bar', 'yaml');

// Convert to string
$structure->toString('yaml');

StructureHelper

use Windwalker\Structure\StructureHelper;

StructureHelper::loadFaile($file, $format); // File to array
StructureHelper::loadString($string, $format); // String to array
StructureHelper::toString($array, $format); // Array to string

// Use format class
$json = StructureHelper::getFormatClass('json'); // Get JsonFormat
$string = $json::structToString($array);