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中,您需要特殊的语法来格式化这些类型:

  1. 日期CONVERT(varchar(10),date_col,120)- 120的格式为2020-10-29 11:32:00varchar(10)仅修剪日期部分,varchar(20)获得整个日期和时间2
  2. 布尔值CAST(boolean_col as bit)0 -> false1 -> true

更多信息:

  1. SQL:Format query results as JSON with FOR JSON
  2. SQL:CAST and CONVERT with datetime in different formats
  3. 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
                )

        )

)

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...