php flatten
v4.0.1
一個實用函數,主要將多維數組和可遍歷元素展平為一維數組,保留鍵並將它們與可自訂的分隔符號連接起來,以形成最終數組中的完全限定鍵。
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
請注意,FQkey 中的前綴不會被分隔。如果需要分隔,則必須在前綴字串後附加分隔符號。
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 );
FLAG_NUMERIC_NOT_FLATTENED
使用數字(整數)鍵關閉展平值。
這些值將被包裝在一個陣列中(保留它們的鍵)並與父 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 );