php flatten
v4.0.1
주로 다차원 배열과 순회 가능 항목을 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
접두사는 FQ키에서 분리되지 않습니다. 분리해야 하는 경우 접두사 문자열에 구분 기호를 추가해야 합니다.
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 );