如何解决PHP 7.2-SQL Server 2017-创建嵌套数组响应
我有一个存储过程,可以从SQL Server数据库中检索数据。
对于查询结果,我需要填充SOAPClient方法的参数数组
目前,我正在手动创建数组,但我想知道是否有可能(并且值得)直接从TSQL以SOAP方法所需的方式创建数组:
使用PHP 7.2-SQL Server 2017
让我用一个例子来解释: 这是我的查询结果:
Array
(
[Key] => R******l
[Password] => c*************z
[AccountNumber] => 0****1
[MeterNumber] => 2******5
[ShipTimestamp] => 2020-10-29T10:24:19+01:00
[ServiceType] => INTERNATIONAL_ECONOMY
[PackagingType] => YOUR_PACKAGING
[PreferredCurrency] => EUR
[Weight_Units] => KG
[TotalWeight] => 0.02
...
)
它应该返回如下内容:
Array
(
[Authentication] => Array
(
[User] => Array
(
[Key] => R******l
[Password] => c*************z
)
)
[Client] => Array
(
[Account] => 0*******1
[Meter] => 2*******5
)
[Shipment] => Array
(
[ShipTimestamp] => 2020-10-29T10:41:26+01:00
[DropoffType] => REGULAR_PICKUP
[ServiceType] => INTERNATIONAL_ECONOMY
[PackagingType] => YOUR_PACKAGING
[PreferredCurrency] => EUR
[TotalWeight] => Array
(
[Units] => KG
[Value] => 0.02
)
)
...
)
有可能而且值得吗?
解决方法
您可以在SQL和PHP FOR JSON PATH
1中使用json_decode($json,true)
3 在一行中返回一个带有JSON列的行 sup>,并将$assoc
参数设置为true
,以将JSON解码为数组。
SELECT (
SELECT user_key [Authentication.User.Key],user_password [Authentication.User.Password],client_account [Client.Account],client_meter [Client.Meter]
--- and so on
FROM my_table
FOR JSON PATH
) [json]
结果应为JSON
{
"Authentication": { "User": { "Key": "XXX","Password": "XXX" } },"Client": { "Account": "YYY","Meter": 200500 }
}
现在您可以在PHP中获取该值,对其进行解码并提供给SOAP。
$row = sqlsrv_fetch_array($stmt,SQLSRV_FETCH_ASSOC);
$json = json_decode($row['json'],true);
但是在SQL中,您需要特殊的语法来格式化这些类型:
- 日期值
CONVERT(varchar(10),date_col,120)
-120
的格式为2020-10-29 11:32:00
,varchar(10)
仅修剪日期部分,varchar(20)
获得整个日期和时间2 - 布尔值值
CAST(boolean_col as bit)
(0 -> false
,1 -> true
)
更多信息:
- SQL:Format query results as JSON with FOR JSON
- SQL:CAST and CONVERT with datetime in different formats
- PHP:json_decode
作为示例,也可以通过映射完成。
数据定义为
$data = [
'Key' => 'R******l','Password' => 'c*************z','AccountNumber' => '0****1','MeterNumber' => '2******5','ShipTimestamp' => '2020-10-29T10:24:19+01:00','ServiceType' => 'INTERNATIONAL_ECONOMY','PackagingType' => 'YOUR_PACKAGING','PreferredCurrency' => 'EUR','Weight_Units' => 'KG','TotalWeight' => '0.02',];
使用哈希表定义的映射。名字可能会改变,团体可能会像我想要的那样深。
$mapping = [
'Key' => ['name' => 'Key','group' => ['Authentication','User']],'Password' => ['name' => 'Password','AccountNumber' => ['name' => 'Account','group' => ['Client']],'MeterNumber' => ['name' => 'Meter','ShipTimestamp' => ['name' => 'ShipTimestamp','group' => ['Shipment']],'ServiceType' => ['name' => 'ServiceType','PackagingType' => ['name' => 'PackagingType','PreferredCurrency' => ['name' => 'PreferredCurrency','Weight_Units' => ['name' => 'Units','group' => ['Shipment','TotalWeight']],'TotalWeight' => ['name' => 'Value',];
现在有了一个简单的例程,可以通过映射表重新映射数据并将其放入$mappedData
。
$mappedData = [];
foreach($data as $key => $value) {
$map = $mapping[$key];
$root = array_shift($map['group']);
krsort($map['group']);
$value = [$map['name'] => $value];
foreach($map['group'] as $group) {
$value = [$group => $value];
}
$new[$root] = $value;
$mappedData = array_replace_recursive ($mappedData,$new);
}
执行时看起来像这样
Array
(
[Authentication] => Array
(
[User] => Array
(
[Key] => R******l
[Password] => c*************z
)
)
[Client] => Array
(
[Account] => 0****1
[Meter] => 2******5
)
[Shipment] => Array
(
[ShipTimestamp] => 2020-10-29T10:24:19+01:00
[ServiceType] => INTERNATIONAL_ECONOMY
[PackagingType] => YOUR_PACKAGING
[PreferredCurrency] => EUR
[TotalWeight] => Array
(
[Units] => KG
[Value] => 0.02
)
)
)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。