grasmash/expander

Expands internal property references in PHP arrays.

Maintainers

👁 grasmash

Package info

github.com/grasmash/expander

pkg:composer/grasmash/expander

Statistics

Installs: 63 872 086

Dependents: 5

Suggesters: 0

Stars: 139

Open Issues: 2

4.0.0 2026-06-11 12:54 UTC

Requires

Requires (Dev)

Suggests

None

Provides

None

Conflicts

None

Replaces

None

MIT adcfe3e6a4a3dc4ca25cfc3fb4a1c0a26e1a4b15

  • Matthew Grasmick

yamlconfigurationarrayplaceholderdot-notationexpansion


README

👁 CI
👁 Packagist
👁 Total Downloads
👁 Coverage Status

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.

Installation

composer require grasmash/expander

Example usage:

Property references use dot notation to indicate array keys, and must be wrapped in ${}.

Expansion logic:

<?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 Stringifier, used to convert array placeholders into strings. Defaults to using implode() with `,` delimiter.
// @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:

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
 )

)