我正在调用一个返回XML数据的Web服务。当我将xml数据转换为json时,问题就出现了。某些应该返回对象数组的元素,在只有一个值时,不会被转换为仅包含一个对象的数组,而是变成了一个对象。因此,与其拥有:
{
"products":[ { "title":"Title 1", "attributes":[{"color":"blue"}] } ]
}
我理解
{
"products":{ "title":"Title 1", "attributes":{"color":"blue"} }
}
PHP数组现在是这样的:
[products] => Array ( [title] => 标题1 [attributes] => Array ( [color] => 蓝色 ) )
而不是这样:
[products] => Array ( [0] => Array ( [title] => 标题1
[attributes] => Array ([0] => Array ([color] => 蓝色 ) ) )
所以我已经做了以下工作:
$xml = simplexml_load_string($messageData);
$json = json_encode($xml);
$array = json_decode($json, TRUE);
if (isset($array['products']) && !isset($array['products'][0])) {
$array['products'] = array($array['products']);
}
我检查是否存在名为“products”的数组,如果没有索引0,我将其嵌套在一个新的数组中。这样做就可以解决问题。然后我对属性数组也做同样的操作,如下所示:
$products = $array['products'];
$array['products'] = [];
foreach ($products as $product) {
if (isset($product['attributes']) && !isset($product['attributes'][0])) {
$product['attributes'] = array($product['attributes']);
}
array_push($array['products'], product);
}
在这里,我将产品数组绑定到一个名为
products
的变量中以在循环中使用它,然后清空该数组。在创建新属性数组后,我将更改后的产品填入产品数组中。
我的问题是:
有没有更好的方法来处理这件事?我不喜欢我在这里做的事情,但我想不出其他办法......
编辑
这是我的soap请求:
$client = new SoapClient($wsdl, $soapOptions);
$soapHeader = WsSecurity::createWsSecuritySoapHeader($username, $password, false, $synced, 60, true, true, false, true);
$client->__setSoapHeaders($soapHeader);
$response = $client->dateRetrieveMovement($dateMovementRequest);
$movements = $response->DateMovementRequestResult->movements;
$movementInfo = $movements->movementInfo;
$messages = $movementInfo->messages->messageExchanged;
$messageData = $messages->IEMessage->xmlData;
$xml = simplexml_load_string($messageData);
$json = json_encode($xml);
$array = json_decode($json, TRUE);
simplexml_load_string()
函数... - gothaf