schemator php
1.0.0
回路図データ マッパーは、指定された変換スキーマに従って、ネストされたデータ構造 (連想配列、非連想配列、およびオブジェクトの任意の構成) を変換するためのツールです。
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 ]]
params リストの述語に一致する、指定された配列の要素を含む配列を返します。
ルール:
["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 ]]
params リストのルールに従って値が置き換えられた要素の配列を返します。
ルール:
["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 ライセンスに基づいてライセンスされています。