PHP 7.2-SQL Server 2017-创建嵌套数组响应

如何解决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
                )

        )

)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 <select id="xxx"> SELECT di.id, di.name, di.work_type, di.updated... <where> <if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 <property name="dynamic.classpath" value="tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -> systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping("/hires") public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate<String
使用vite构建项目报错 C:\Users\ychen\work>npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-