sarhan / php-flatten
将多维数组、可遍历对象和变量压缩成一维数组。
v4.0.1
2023-12-02 13:39 UTC
Requires
- php: ^7.1|^8.0
Requires (Dev)
- phpunit/phpunit: ^7.0|^8.0|^9.0
- squizlabs/php_codesniffer: ^2.3|^3.0
README
一个实用函数,主要用于将多维数组、可遍历对象压缩成一维数组,保留键并将它们与可定制的分隔符连接起来,以形成最终数组中的完全限定键。
安装
composer require sarhan/php-flatten
用法
示例 1
use Sarhan\Flatten\Flatten; $multiArray = [ 'say' => 'what', 'hi' => [ 'de' => 'Hallo', 'es' => 'Hola' ] ]; /* Flatten::__construct( string $separator = '.', string $prefix = '', int $flags = 0 ) */ $flatten = new Flatten(); // Flatten::flattenToArray is provided for convinience. It internally // calls Flatten::flatten and converts it's output, which is a 1-dimensional // iterator, into a 1-dimensional array. $flattened = $flatten->flattenToArray($multiArray); // Flatten::unflattenToArray is provided for convinience. It internally // calls Flatten::unflatten and converts it's output, which is a recursive // generator structure, into a multi-dimensional array. $unflattened = $flatten->unflattenToArray($flattened); assert($flattened == [ 'say' => what 'hi.de' => Hallo 'hi.es' => Hola ]); assert($unflattened == $multiArray);
示例 2
自定义分隔符和初始前缀
use Sarhan\Flatten\Flatten; $allowAccess = [ 'root' => false, 'var' => [ 'log' => ['nginx' => true, 'apt' => false], 'www' => true ], ]; $flatten = new Flatten( '/', // separator '/' // prefix ); $flattened = $flatten->flattenToArray($allowAccess); $unflattened = $flatten->unflattenToArray($flattened); assert($flatten == [ '/root' => false, '/var/log/nginx' => true, '/var/log/apt' => false, '/var/www' => true ]); assert($unflattened == $allowAccess);
示例 3
注意,前缀在FQkeys中不会分隔。如果应该分隔,则必须将分隔符附加到前缀字符串上。
use Sarhan\Flatten\Flatten; $api = [ 'category' => [ 'health' => 321, 'sport' => 769, 'fashion' => 888 ], 'tag' => [ 'soccer' => 7124, 'tennis' => [ 'singles' => 9833, 'doubles' => 27127 ] ], ]; $flatten = new Flatten('/', 'https://api.dummyhost.domain/'); $flattened = $flatten->flattenToArray($api); $unflattened = $flatten->unflattenToArray($flattened); assert($flattened == [ 'https://api.dummyhost.domain/category/health' => 321, 'https://api.dummyhost.domain/category/sport' => 769, 'https://api.dummyhost.domain/category/fashion' => 888, 'https://api.dummyhost.domain/tag/soccer' => 7124, 'https://api.dummyhost.domain/tag/tennis/singles' => 9833, 'https://api.dummyhost.domain/tag/tennis/doubles' => 27127 ]); assert($unflattened == $api);
示例 4
数值键被视为关联键。
注意:此行为可以通过标志进行更改。请参阅 FLAG_NUMERIC_NOT_FLATTENED
use Sarhan\Flatten\Flatten; $nutrition = [ 'nutrition', 'fruits' => [ 'oranges', 'apple', 'banana' ], 'veggies' => ['lettuce', 'broccoli'], ]; $flatten = new Flatten('-'); $flattened = $flatten->flattenToArray($nutrition); $unflattened = $flatten->unflattenToArray($flattened); assert($flattened == [ '0' => 'nutrition', 'fruits-0' => 'oranges', 'fruits-1' => 'apple', 'fruits-2' => 'banana', 'veggies-0' => 'lettuce', 'veggies-1' => 'broccoli' ]); assert($unflattened == $nutrition);
标志
关闭对具有数值(整数)键的值的压缩。
这些值将被包裹在一个数组中(保留它们的键)并关联到父FQK。
use Sarhan\Flatten\Flatten; $examples = [ 'templates' => [ ['lang' => 'js', 'template' => "console.log('%s');"], ['lang' => 'php', 'template' => 'echo "%s";'] ], 'values' => [3 => 'hello world', 5 => 'what is your name?'] ]; $flatten = new Flatten( '.', 'examples.', Flatten::FLAG_NUMERIC_NOT_FLATTENED ); $flattened = $flatten->flattenToArray($examples); $unflattened = $flatten->unflattenToArray($flattened); assert($flattened == [ 'examples.templates' => [ [ 'lang' => 'js', 'template' => 'console.log(\'%s\')'; ], [ 'lang' => 'php', 'template' => 'echo "%s"' ] ], 'examples.values' => [ 3 => 'hello world', 5 => 'what is your name?' ] ]); assert($unflattened == $examples);
顶层数值(整数)键也将作为分配给传递的前缀的数组返回。
use Sarhan\Flatten\Flatten; $seats = [ 'A1', 'A2', 'B1', 'B2', '_reserved' => ['A1', 'B1'], '_blocked' => ['B2'] ]; $flatten = new Flatten( '_', 'seats', Flatten::FLAG_NUMERIC_NOT_FLATTENED ); $flattened = $flatten->flattenToArray($seats); $unflattened = $flatten->unflattenToArray($flattened); assert($flattened == [ 'seats' => ['A1', 'A2', 'B1', 'B2'], 'seats_reserved' => ['A1', 'B1'], 'seats_blocked' => ['B2'] ]); assert($unflattened == $seats);