Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SOAP响应上的PHP json_encode返回数组(如果多个),但返回对象(如果单个)?_Php_Arrays_Soap_Json - Fatal编程技术网

SOAP响应上的PHP json_encode返回数组(如果多个),但返回对象(如果单个)?

SOAP响应上的PHP json_encode返回数组(如果多个),但返回对象(如果单个)?,php,arrays,soap,json,Php,Arrays,Soap,Json,我有一个Windows桌面小工具,对我的一小部分用户来说,几个月前它突然停止工作了。似乎他们突然不喜欢跨域请求(即使所有服务器都在我们的内部网上)。所以,我正在重写它,这样它就可以进入一个后端服务器,我可以对它进行很多控制。。。它对后端的Ajax查询被设置为使用数据类型:jsonp。与此同时,gadget查询la Ajax的php脚本调用SOAP服务,获取数据,将其转换为数组,然后使用json_encode将其转换为字符串,并在gadget/javascript端添加对回调函数的引用 我的问题似

我有一个Windows桌面小工具,对我的一小部分用户来说,几个月前它突然停止工作了。似乎他们突然不喜欢跨域请求(即使所有服务器都在我们的内部网上)。所以,我正在重写它,这样它就可以进入一个后端服务器,我可以对它进行很多控制。。。它对后端的Ajax查询被设置为使用数据类型:jsonp。与此同时,gadget查询la Ajax的php脚本调用SOAP服务,获取数据,将其转换为数组,然后使用json_encode将其转换为字符串,并在gadget/javascript端添加对回调函数的引用

我的问题似乎是json_编码。如果SOAP响应包含单个数据记录,则它将其作为对象发送。如果SOAP响应包含多个记录,则它会像数组一样将其括起来

示例:

单一记录:

`{
  "SmeDetail": {
    "SipAddress": "jane.smith@whatever.com",
    "SubjectExpert": "Smith,Jane",
    "SubjectMatter": "Unix"
  }
}`
多个记录:

`{
  "SmeDetail": [
    {
      "SipAddress": "fred.flintstone@whatever.com",
      "SubjectExpert": "Flintstone,Fred",
      "SubjectMatter": "Bedrock"
    },
    {
      "SipAddress": "barney.rubble@whatever.com",
      "SubjectExpert": "Rubble,Barney",
      "SubjectMatter": "Bedrock"
    },
    {
      "SipAddress": "wilma.flintstone@whatever.com",
      "SubjectExpert": "Flintsone,Wilma",
      "SubjectMatter": "Bedrock"
    }
  ]
}`
在php脚本中,典型的SOAP调用如下所示:

$Service_URL = 'http://server/PROD/OurWcfService/WcfService.svc?wsdl';
$client = new SoapClient($Service_URL);
$res= $client->GetSMEDetails($params)->GetSMEDetailsResult;
然后$res被输入到这个例程中:

$json_data = json_encode((array)$res);
echo $_GET['callback_name'].'('.$json_data.');';
这就是作为Ajax响应反馈的回声

我甚至不知道我在哪里读到关于使用这个json_encode((array)$res)将Soap响应转换为数组,然后转换为json编码的字符串。但我想知道我是不是做错了什么?我想我需要确保将单个记录作为一个数组进行推送。我宁愿用“正确的方法”来解决这个问题,也不愿对字符串进行某种破解


有什么想法吗?

我认为出现问题的原因是GetSMEDetailsResult返回的不是数组(singlerecord),而是singlerecord本身

检查“是否关联”怎么样

提示:

这个解决方案很难看,但应该有效。 另一种方法是检查“是否设置了SipAddress”:


对于未来的读者:我在PHP脚本中加入了一些调试,并发现。。。的确原始的$res值是一个stdClass对象“smetail”,包含一个由各个字段组成的stdClass对象。。。当$res返回单个“记录”时。但是,当$res返回多个记录时,它返回一个stdClass对象“smetail”,其中包含一个stdClass对象数组,每个记录一个。因此,似乎SOAP客户端将XML处理成了问题所在的对象。顺便说一下,我的PHP版本是5.4.14。
function isAssoc($arr)
{
    return array_keys($arr) !== range(0, count($arr) - 1);
}

if(isAssoc($res['SmeDetail'])) $res['SmeDetail'] = array($res['SmeDetail']);
if(isset($res['SmeDetail']['SipAddress'])) $res['SmeDetail'] = array($res['SmeDetail']);