schemator php
1.0.0
Schematic data mapper는 주어진 변환 스키마에 따라 중첩된 데이터 구조(연관 배열, 비연관 배열 및 객체의 구성)를 변환하기 위한 도구입니다.
composer require smoren/schemator
use Smoren Schemator Factories SchematorFactory ;
$ input = [
' id ' => 100 ,
' name ' => ' Oxford ' ,
' country ' => [
' id ' => 10 ,
' name ' => ' UK ' ,
' neighbours ' => [ ' Ireland ' , ' Sweden ' , ' France ' ],
' capitals ' => [
' lnd ' => ' London ' ,
' edb ' => ' Edinburgh ' ,
],
],
' streets ' => [
[
' id ' => 1000 ,
' name ' => ' Woodstock Rd ' ,
' houses ' => [ 1 , 5 , 9 ],
],
[
' id ' => 1002 ,
' name ' => ' Banbury Rd ' ,
' houses ' => [ 22 , 35 , 49 ],
],
[
' id ' => 1003 ,
' name ' => ' Beamont St ' ,
' houses ' => [ 11 , 12 , 15 ],
],
],
' lnd_path ' => ' country.capitals.lnd ' ,
];
$ schema = [
' city_id ' => ' id ' ,
' city_name ' => ' name ' ,
' city_street_names ' => ' streets.*.name ' ,
' country_id ' => ' country.id ' ,
' country_name ' => ' country.name ' ,
' country_neighbours ' => ' country.neighbours ' ,
' country_neighbour ' => ' country.neighbours ' ,
' country_first_capital ' => ' country.capitals.lnd ' ,
' country_second_capital ' => ' country.capitals.edb ' ,
' country_data.country_id ' => ' country.id ' ,
' country_data.country_name ' => ' country.name ' ,
];
$ schemator = SchematorFactory:: create ();
$ output = $ schemator -> convert ( $ input , $ schema );
print_r ( $ output );
/* Array
(
[city_id] => 100
[city_name] => Oxford
[city_street_names] => Array
(
[0] => Woodstock Rd
[1] => Banbury Rd
[2] => Beamont St
)
[country_id] => 10
[country_name] => UK
[country_neighbours] => Array
(
[0] => Ireland
[1] => Sweden
[2] => France
)
[country_neighbour] => Array
(
[0] => Ireland
[1] => Sweden
[2] => France
)
[country_first_capital] => London
[country_second_capital] => Edinburgh
[country_data] => Array
(
[country_id] => 10
[country_name] => UK
)
)
*/
use Smoren Schemator Factories SchematorFactory ;
use Smoren Schemator Structs ErrorsLevelMask ;
use Smoren Schemator Exceptions SchematorException ;
$ input = [
' some_key ' => null ,
];
$ schema = [
' my_value ' => [ ' some_key ' , [ ' date ' , ' Y-m-d ' ]],
];
$ schemator = SchematorFactory:: createBuilder ()
-> withErrorsLevelMask (
ErrorsLevelMask:: nothing ()
-> add ([SchematorException:: FILTER_ERROR , SchematorException:: CANNOT_GET_VALUE ])
)
-> get ();
try {
$ schemator -> convert ( $ input , $ schema );
} catch ( SchematorException $ e ) {
echo $ e -> getMessage (); // filter error: 'date'
}
use Smoren Schemator Factories SchematorFactory ;
use Smoren Schemator Filters BaseFiltersStorage ;
$ input = [
' id ' => 100 ,
' name ' => ' Oxford ' ,
' country ' => [
' id ' => 10 ,
' name ' => ' UK ' ,
' neighbours ' => [ ' Ireland ' , ' Sweden ' , ' France ' ],
' capitals ' => [
' lnd ' => ' London ' ,
' edb ' => ' Edinburgh ' ,
],
],
' streets ' => [
[
' id ' => 1000 ,
' name ' => ' Woodstock Rd ' ,
' houses ' => [ 1 , 5 , 9 ],
],
[
' id ' => 1002 ,
' name ' => ' Banbury Rd ' ,
' houses ' => [ 22 , 35 , 49 ],
],
[
' id ' => 1003 ,
' name ' => ' Beamont St ' ,
' houses ' => [ 11 , 12 , 15 ],
],
],
' lnd_path ' => ' country.capitals.lnd ' ,
];
$ schema = [
' city_street_names.all ' => [ ' streets.*.name ' , [ ' implode ' , ' , ' ]],
' city_street_names.sorted ' => [ ' streets.*.name ' , [ ' sort ' ], [ ' implode ' , ' , ' ]],
' city_street_names.filtered ' => [ ' streets.*.name ' , [ ' filter ' , fn ( string $ candidate ) => strpos ( $ candidate , ' Ban ' ) !== false ]],
' lnd ' => [ ' lnd_path ' , [ ' path ' ]],
' city_street_houses ' => [ ' streets.*.houses ' , [ ' flatten ' ]],
];
$ schemator = SchematorFactory:: create ();
$ output = $ schemator -> convert ( $ input , $ schema );
print_r ( $ output );
/*
Array
(
[city_street_names] => Array
(
[all] => Woodstock Rd, Banbury Rd, Beamont St
[sorted] => Banbury Rd, Beamont St, Woodstock Rd
[filtered] => Array
(
[0] => Banbury Rd
)
)
[lnd] => London
[city_street_houses] => Array
(
[0] => 1
[1] => 5
[2] => 9
[3] => 22
[4] => 35
[5] => 49
[6] => 11
[7] => 12
[8] => 15
)
)
*/
use Smoren Schemator Factories SchematorFactory ;
use Smoren Schemator Filters BaseFiltersStorage ;
$ schemator = SchematorFactory:: create ();
$ input = [
' numbers ' => [- 1 , 10 , 5 , 22 , - 10 , 0 , 35 , 7 , 8 , 9 , 0 ],
];
$ output = $ schemator -> convert ( $ input , [
' positive ' => [
' numbers ' ,
[ ' filter ' , [[ ' > ' , 0 ]]],
[ ' sort ' ],
],
' negative ' => [
' numbers ' ,
[ ' filter ' , [[ ' < ' , 0 ]]],
[ ' sort ' ],
],
' complicated ' => [
' numbers ' ,
[ ' filter ' , [[ ' >= ' , 8 ], [ ' < ' , 0 ]]],
[ ' filter ' , [[ ' < ' , 22 ]]],
[ ' sort ' ],
],
]);
print_r ( $ output );
/*
Array
(
[positive] => Array
(
[0] => 5
[1] => 7
[2] => 8
[3] => 9
[4] => 10
[5] => 22
[6] => 35
)
[negative] => Array
(
[0] => -10
[1] => -1
)
[complicated] => Array
(
[0] => -10
[1] => -1
[2] => 8
[3] => 9
[4] => 10
)
)
*/
$ output = $ schemator -> convert ( $ input , [
' number_types ' => [ ' numbers ' , [
' replace ' ,
[
[ ' =0 ' , ' = ' , 0 ],
[ ' >9 ' , ' > ' , 9 ],
[ ' <0 ' , ' < ' , 0 ],
[ ' 1-8 ' , ' between ' , 1 , 8 ],
]
]]
]);
print_r ( $ output );
/*
Array
(
[number_types] => Array
(
[0] => <0
[1] => >9
[2] => 1-8
[3] => >9
[4] => <0
[5] => =0
[6] => >9
[7] => 1-8
[8] => 1-8
[9] => 9
[10] => =0
)
)
*/
use Smoren Schemator Factories SchematorFactory ;
use Smoren Schemator Interfaces FilterContextInterface ;
$ schemator = SchematorFactory:: createBuilder ()
-> withFilters ([
' startsWith ' => function ( FilterContextInterface $ context , string $ start ) {
return array_filter ( $ context -> getSource (), function ( string $ candidate ) use ( $ start ) {
return strpos ( $ candidate , $ start ) === 0 ;
});
},
])
-> get ();
$ input = [
' streets ' => [ ' Woodstock Rd ' , ' Banbury Rd ' , ' Beamont St ' ],
];
$ schema = [
' street_names ' => [ ' streets ' , [ ' startsWith ' , ' T ' ], [ ' implode ' , ' , ' ]],
];
$ output = $ schemator -> convert ( $ input , $ schema );
print_r ( $ output );
/*
Array
(
[street_names] => Woodstock Rd, Beamont St
)
*/
use Smoren Schemator Factories SchematorFactory ;
$ massSchemator = SchematorFactory:: createMass ();
$ cities = [
[
' id ' => 100 ,
' name ' => ' London ' ,
' country ' => [
' id ' => 10 ,
' name ' => ' UK ' ,
],
' streets ' => [
[
' id ' => 1001 ,
' name ' => ' The Mall ' ,
],
[
' id ' => 1002 ,
' name ' => ' Carnaby Street ' ,
],
],
],
[
' id ' => 101 ,
' name ' => ' Oxford ' ,
' country ' => [
' id ' => 10 ,
' name ' => ' UK ' ,
],
' streets ' => [
[
' id ' => 1003 ,
' name ' => ' Turl Street ' ,
],
[
' id ' => 1004 ,
' name ' => ' Holywell Street ' ,
],
],
],
];
$ schema = [
' city_id ' => ' id ' ,
' city_name ' => ' name ' ,
' city_street_names ' => ' streets.*.name ' ,
' country_id ' => ' country.id ' ,
' country_name ' => ' country.name ' ,
];
$ gen = $ massSchemator -> generate ( $ cities , $ schema );
$ result = [];
foreach ( $ gen as $ item ) {
$ result [] = $ item ;
}
print_r ( $ result );
/*
Array
(
[0] => Array
(
[city_id] => 100
[city_name] => London
[city_street_names] => Array
(
[0] => The Mall
[1] => Carnaby Street
)
[country_id] => 10
[country_name] => UK
)
[1] => Array
(
[city_id] => 101
[city_name] => Oxford
[city_street_names] => Array
(
[0] => Turl Street
[1] => Holywell Street
)
[country_id] => 10
[country_name] => UK
)
)
*/
const param에서 값을 설정합니다.
개요:
[ " value " => [[ " const " , " My const value " ]]]
결과:
[ " value " => " My const value " ]
주어진 배열의 합계를 반환합니다.
주어진:
[ " numbers " => [ 1 , 2 , 3 , 4 , 5 ]]
개요:
[ " value " => [ " numbers " , [ " sum " ]]]
결과:
[ " value " => 15 ]
주어진 배열의 평균을 반환합니다.
주어진:
[ " numbers " => [ 1 , 2 , 3 , 4 , 5 ]]
개요:
[ " value " => [ " numbers " , [ " average " ]]]
결과:
[ " value " => 3 ]
주어진 값의 Unix 타임스탬프에서 형식화된 날짜를 반환합니다.
매개변수:
dmY H:i:s
주어진:
[ " some_date " => 1651481881 ]
개요:
[ " value " => [ " some_date " , [ " date " , " d.m.Y H:i:s " , 3 ]]]
결과:
[ " value " => " 02.05.2022 11:58:01 " ]
인수 목록의 구분 기호를 사용하여 주어진 배열의 내포된 항목 문자열을 반환합니다.
매개변수:
;
주어진:
[ " numbers " => [ 1 , 2 , 3 , 4 , 5 ]]
개요:
[ " value " => [ " numbers " , [ " implode " , " ; " ]]]
결과:
[ " value " => " 1; 2; 3; 4; 5 " ]
인수 목록의 구분 기호를 사용하여 주어진 문자열에서 분해된 문자열 배열을 반환합니다.
매개변수:
;
주어진:
[ " numbers " => " 1; 2; 3; 4; 5 " ]
개요:
[ " value " => [ " numbers " , [ " explode " , " ; " ]]]
결과:
[ " value " => [ " 1 " , " 2 " , " 3 " , " 4 " , " 5 " ]]
트리 배열의 모든 막다른 잎을 포함하는 평면 배열을 반환합니다.
주어진:
[
" numbers " => [
[
[ 1 , 2 , 3 ],
[ 4 , 5 , 6 ]
],
[ 7 , 8 , 9 ]
],
]
개요:
[ " value " => [ " numbers " , [ " flatten " ]]]
결과:
[ " value " => [ 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 ]]
주어진 배열을 정렬하고 반환합니다.
주어진:
[ " numbers " => [ 3 , 5 , 4 , 1 , 2 ]]
개요:
[ " value " => [ " numbers " , [ " sort " ]]]
결과:
[ " value " => [ 1 , 2 , 3 , 4 , 5 ]]
역순으로 정렬하고 주어진 배열을 반환합니다.
주어진:
[ " numbers " => [ 3 , 5 , 4 , 1 , 2 ]]
개요:
[ " value " => [ " numbers " , [ " sort " ]]]
결과:
[ " value " => [ 5 , 4 , 3 , 2 , 1 ]]
매개변수 목록의 조건자와 일치하는 지정된 배열의 요소를 포함하는 배열을 반환합니다.
규칙:
["predicate name", ...parans]
형식이 있습니다.["=", 10]
value = 10
의미합니다.[">", 10]
value > 10
의미합니다.[">=", 10]
value >= 10
의미합니다.["<", 10]
value < 10
의미합니다.["<=", 10]
value <= 10
의미합니다.["in", [1, 2]]
value = 1 OR value = 2
의미합니다.["not in", [1, 2]]
는 value != 1 AND value != 2
의미합니다.["between", 1, 5]
1 <= value <= 5
의미합니다.["between strict", 1, 5]
1 < value < 5
의미합니다.주어진:
[ " numbers " => [- 5 , - 3 , - 1 , 1 , 3 , 5 ]]
개요:
[
" value " => [
" numbers " ,
[
" filter " ,
[[ " > " , 1 ], [ " < " , - 1 ]] // value > 1 OR value < -1
],
],
]
결과:
[ " value " => [- 5 , - 3 , 3 , 5 ]]
매개변수 목록의 규칙에 따라 값이 대체된 요소 배열을 반환합니다.
규칙:
["value to replace", "rule name", ...params]
형식이 있습니다.["=", 10]
value = 10
의미합니다.[">", 10]
value > 10
의미합니다.[">=", 10]
value >= 10
의미합니다.["<", 10]
value < 10
의미합니다.["<=", 10]
value <= 10
의미합니다.["in", [1, 2]]
value = 1 или value = 2
의미합니다.["not in", [1, 2]]
value != 1 и value != 2
의미합니다.["between", 1, 5]
1 <= value <= 5
의미합니다.["between strict", 1, 5]
1 < value < 5
의미합니다.["else"]
— 값과 일치하는 규칙이 없습니다 . ( else
규칙이 사용되지 않은 경우 기본적으로 해당 값은 null
로 대체됩니다.)주어진:
[ " numbers " => [- 5 , - 3 , - 1 , 0 , 1 , 3 , 5 ]]
개요:
[
" value " => [
" numbers " ,
[
" replace " ,
[
[ " positive " , " > " , 0 ],
[ " negative " , " < " , 0 ],
[ " zero " , " else " ]
],
],
],
]
결과:
[ " value " => [ " negative " , " negative " , " negative " , " zero " , " positive " , " positive " , " positive " ]]
주어진:
[ " numbers " => [- 5 , - 3 , - 1 , 1 , 3 , 5 ]]
개요:
[
" value " => [
" numbers " ,
[
" filter " ,
[[ " > " , 1 ], [ " < " , - 1 ]] // (value > 1 OR value < -1)
],
// AND
[
" filter " ,
[[ " >= " , - 3 ]] // value >= -3
],
],
]
결과:
[ " value " => [- 3 , 3 , 5 ]]
composer install
composer test-init
composer test
Schemator는 다음 표준을 준수합니다.
Schemator는 MIT 라이선스에 따라 라이선스가 부여됩니다.