alexrili / phmap
负载映射和转换。从A结构到B结构
Requires
- php: >=8.1
- ext-json: *
- alexrili/vephar: ^2.0
- illuminate/support: >=9
Requires (Dev)
- phpunit/phpunit: >=9
README
这是一个用PHP编写的负载映射。这个库可以帮助您从A结构中获取值并将其放置在B结构上
注意:Phmap底层使用illuminate/support
。如果您使用laravel或lumen框架,请确保您的版本是>= 9.x,如果您不使用这些框架或此依赖项(illuminate/support),则无需担心。
安装
通过Composer
$ composer require alexrili/phmap
基本用法
在底层,我们提供了一个payload_map()
辅助函数。该payload_map()
接受两个参数:1°是您的输入数据,2°是您的映射配置。两者都需要是数组类型。下面是一个例子。
#can be a response from api request $inputData = [ 'a' => 'Value from A' ]; $map = [ 'from' => 'a', 'to' => 'b' ]; $response = payload_map($inputData, $map);
// var_dump($response);
// return will be
array:1 [
"b" => "Value from A"
]
现在让我们想象您有一个来自数组的多个值,并需要更改内部属性。使用Phmap
您就可以做到这一点:)
# e.g: Imagine that you have the following payload $oldPayload = [ 'addresses' => [ [ 'mainAddress' => true, 'address' => '54 St', 'code' => '676329-098' ], [ 'mainAddress' => false, 'address' => 'Saint Louis Av', 'code' => '4432-098' ] ] ]; $map = [ [ 'from' => 'addresses.*.address', 'to' => 'users_addresses.*.street_name' ], [ 'from' => 'addresses.*.code', 'to' => 'users_addresses.*.postal_code' ] ]; $newPayload = payload_map($inputData, $map);
// var_dump($newPayload);
// return will be
array:2 [
"users_addresses" => [
[
"street_name" => "54 St",
"postal_code" => "676329-098"
],
[
"street_name" => "Saint Louis Av",
"postal_code" => "4432-098
]
]
]
注意:在新的负载中没有
mainAddress
属性,这是因为我们没有告诉负载映射映射该属性
映射配置
直接值
您可以直接映射结构中的值,只需在
from
键中指定值的位置,并在to
键中指定目标路径
[ "from" =>"a", "to" => "b" ]
连接值
您可以使用
.+.
符号连接一个或多个值
[ "from" =>"a.a1.+.a.a2", "to" => "b" ]
固定值
您可以使用
__()__
符号添加一些固定值
[ "from" =>"__(This is a fixed value)__", "to" => "b" ]
值集合(数组)
您可以使用
.*.
符号映射数组中的嵌套属性
[ "from" =>"a.*.a1", "to" => "b.*.b1" ]
一个或另一个值
您可以将两个(或更多)不同的路径映射到一个值,然后Phmap将遍历所有路径直到找到值。要指定一个或另一个值,您可以使用
||
符号
[ "from" =>"a||a1", "to" => "b" // if finds value in [a], brings [a], if not try to brings [b] ]
可空值
您可能需要映射一些具有null值的属性,为此,您只需传递一个字符串标志
nullable
,它可以是以下两个值之一 ["true"
|"false"
],如果为true,则表示即使值是null,您也想将该属性带到您的新结构中。默认值是
"false"
[ "from" =>"a", "to" => "b" "nullable" => "true" // if [a] don't have value // the results will be ["b"=>null] ]
高级用法
$inputData = [ 'a' => [ [ 'ac1' => 'I`m a multilevel value' ], [ 'ac1' => 'I`m a multilevel value', ] ], 'aDV' => 'I`m a directed value' ]; $map = [ [ 'from' => 'a.*.ac1.+.__(I`m a fixed value)__.+.aDV', 'to' => 'b.*.bc' ] ]; $response = payload_map($inputData, $map);
// var_dump($response)
// result wil be
array:1 [
"b" => array:2 [
0 => array:1 [
"bc" => "I`m a multilevel valueI`m a fixed valueI`m a directed value"
]
1 => array:1 [
"bc" => "I`m a multilevel valueI`m a fixed valueI`m a directed value"
]
]
]
变更日志
有关最近更改的更多信息,请参阅变更日志。
测试
$ composer test
贡献
安全性
如果您发现任何与安全相关的问题,请通过电子邮件联系alexrili而不是使用问题跟踪器。
致谢
- [Alex Ribeiro][link-author]
- [所有贡献者][link-contributors]
许可证
MIT许可证(MIT)。有关更多信息,请参阅许可证文件。