ฟังก์ชันอรรถประโยชน์ที่จะแบ่งอาร์เรย์หลายมิติและ traversables หลายมิติให้เป็นอาร์เรย์หนึ่งมิติเป็นหลัก โดยรักษาคีย์และรวมคีย์เหล่านั้นเข้ากับตัวคั่นที่ปรับแต่งได้ไปจนถึงจากคีย์ที่มีคุณสมบัติครบถ้วนในอาร์เรย์สุดท้าย
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 );
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 );