154 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			154 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
[](https://github.com/grasmash/expander/actions/workflows/php.yml) [](https://packagist.org/packages/grasmash/expander)
 | 
						|
[](https://packagist.org/packages/grasmash/expander) [](https://coveralls.io/github/grasmash/expander?branch=main)
 | 
						|
 | 
						|
This tool expands dot-notated, string property references into their corresponding values. This is useful for run time expansion of property references in configuration files.
 | 
						|
 | 
						|
For example implementation, see [Yaml Expander](https://github.com/grasmash/yaml-expander).
 | 
						|
 | 
						|
### Installation
 | 
						|
 | 
						|
    composer require grasmash/expander
 | 
						|
 | 
						|
### Example usage:
 | 
						|
 | 
						|
Property references use dot notation to indicate array keys, and must be wrapped in `${}`.
 | 
						|
 | 
						|
Expansion logic:
 | 
						|
 | 
						|
```php
 | 
						|
<?php
 | 
						|
 | 
						|
$array = [
 | 
						|
    'type' => 'book',
 | 
						|
    'book' => [
 | 
						|
        'title' => 'Dune',
 | 
						|
        'author' => 'Frank Herbert',
 | 
						|
        'copyright' => '${book.author} 1965',
 | 
						|
        'protaganist' => '${characters.0.name}',
 | 
						|
        'media' => [
 | 
						|
            0 => 'hardcover',
 | 
						|
            1 => 'paperback',
 | 
						|
        ],
 | 
						|
        'nested-reference' => '${book.sequel}',
 | 
						|
    ],
 | 
						|
    'characters' => [
 | 
						|
        0 => [
 | 
						|
            'name' => 'Paul Atreides',
 | 
						|
            'occupation' => 'Kwisatz Haderach',
 | 
						|
            'aliases' => [
 | 
						|
                0 => 'Usul',
 | 
						|
                1 => 'Muad\'Dib',
 | 
						|
                2 => 'The Preacher',
 | 
						|
            ],
 | 
						|
        ],
 | 
						|
        1 => [
 | 
						|
            'name' => 'Duncan Idaho',
 | 
						|
            'occupation' => 'Swordmaster',
 | 
						|
        ],
 | 
						|
    ],
 | 
						|
    'summary' => '${book.title} by ${book.author}',
 | 
						|
    'publisher' => '${not.real.property}',
 | 
						|
    'sequels' => '${book.sequel}, and others.',
 | 
						|
    'available-products' => '${book.media.1}, ${book.media.0}',
 | 
						|
    'product-name' => '${${type}.title}',
 | 
						|
    'boolean-value' => true,
 | 
						|
    'expand-boolean' => '${boolean-value}',
 | 
						|
    'null-value' => NULL,
 | 
						|
    'inline-array' => [
 | 
						|
        0 => 'one',
 | 
						|
        1 => 'two',
 | 
						|
        2 => 'three',
 | 
						|
    ],
 | 
						|
    'expand-array' => '${inline-array}',
 | 
						|
    'env-test' => '${env.test}',
 | 
						|
];
 | 
						|
 | 
						|
$expander = new Expander();
 | 
						|
// Optionally set a logger.
 | 
						|
$expander->setLogger(new Psr\Log\NullLogger());
 | 
						|
// Optionally set a Stringfier, used to convert array placeholders into strings. Defaults to using implode() with `,` delimeter.
 | 
						|
// @see StringifierInterface.
 | 
						|
$expander->setStringifier(new Grasmash\Expander\Stringifier());
 | 
						|
 | 
						|
// Parse an array, expanding internal property references.
 | 
						|
$expanded = $expander->expandArrayProperties($array);
 | 
						|
 | 
						|
// Parse an array, expanding references using both internal and supplementary values.
 | 
						|
$reference_properties =  'book' => ['sequel' => 'Dune Messiah'];
 | 
						|
// Set an environmental variable.
 | 
						|
putenv("test=gomjabbar");
 | 
						|
$expanded = $expander->expandArrayProperties($array, $reference_properties);
 | 
						|
 | 
						|
print_r($expanded);
 | 
						|
````
 | 
						|
 | 
						|
Resultant array:
 | 
						|
 | 
						|
```php
 | 
						|
Array
 | 
						|
(
 | 
						|
    [type] => book
 | 
						|
    [book] => Array
 | 
						|
        (
 | 
						|
            [title] => Dune
 | 
						|
            [author] => Frank Herbert
 | 
						|
            [copyright] => Frank Herbert 1965
 | 
						|
            [protaganist] => Paul Atreides
 | 
						|
            [media] => Array
 | 
						|
                (
 | 
						|
                    [0] => hardcover
 | 
						|
                    [1] => paperback
 | 
						|
                )
 | 
						|
 | 
						|
            [nested-reference] => Dune Messiah
 | 
						|
        )
 | 
						|
 | 
						|
    [characters] => Array
 | 
						|
        (
 | 
						|
            [0] => Array
 | 
						|
                (
 | 
						|
                    [name] => Paul Atreides
 | 
						|
                    [occupation] => Kwisatz Haderach
 | 
						|
                    [aliases] => Array
 | 
						|
                        (
 | 
						|
                            [0] => Usul
 | 
						|
                            [1] => Muad\'Dib
 | 
						|
                            [2] => The Preacher
 | 
						|
                        )
 | 
						|
 | 
						|
                )
 | 
						|
 | 
						|
            [1] => Array
 | 
						|
                (
 | 
						|
                    [name] => Duncan Idaho
 | 
						|
                    [occupation] => Swordmaster
 | 
						|
                )
 | 
						|
 | 
						|
        )
 | 
						|
 | 
						|
    [summary] => Dune by Frank Herbert
 | 
						|
    [publisher] => ${not.real.property}
 | 
						|
    [sequels] => Dune Messiah, and others.
 | 
						|
    [available-products] => paperback, hardcover
 | 
						|
    [product-name] => Dune
 | 
						|
    [boolean-value] => true,
 | 
						|
    [expand-boolean] => true,
 | 
						|
    [null-value] =>
 | 
						|
    [inline-array] => Array
 | 
						|
        (
 | 
						|
            [0] => one
 | 
						|
            [1] => two
 | 
						|
            [2] => three
 | 
						|
        )
 | 
						|
 | 
						|
    [expand-array] => one,two,three
 | 
						|
    [env-test] => gomjabbar
 | 
						|
    [env] => Array
 | 
						|
        (
 | 
						|
            [test] => gomjabbar
 | 
						|
        )
 | 
						|
 | 
						|
)
 | 
						|
 | 
						|
```
 |