grasmash/expander

在PHP数组文件中展开内部属性引用。

3.0.0 2022-05-10 13:14 UTC

README

CI Packagist Total Downloads Coverage Status

此工具将点符号表示的字符串属性引用展开为其对应的值。这在运行时展开配置文件中的属性引用很有用。

例如,请参阅Yaml Expander的实现。

安装

composer require grasmash/expander

示例用法

属性引用使用点符号表示数组键,必须用${}括起来。

展开逻辑

<?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);

结果数组

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
        )

)