Structure
[DEPRECATED] Nested data structure storage object.
Install / Use
/learn @windwalker-io/StructureREADME
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"
}
}
Supported Formats
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": "^4.0||^5.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);
Related Skills
node-connect
337.7kDiagnose OpenClaw node connection and pairing failures for Android, iOS, and macOS companion apps
frontend-design
83.3kCreate distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, or applications. Generates creative, polished code that avoids generic AI aesthetics.
openai-whisper-api
337.7kTranscribe audio via OpenAI Audio Transcriptions API (Whisper).
commit-push-pr
83.3kCommit, push, and open a PR
