XML 只有一个数组时解析不起作用
XML parsing is not working when it's only one array
我正在解析 xml 如下:
$result = '
<sms>
<status>0</status>
<message>
<contact_lists>
<contact_list><cl_id>11111</cl_id><phone>999999999</phone><name>Neu</name></contact_list>
<contact_list><cl_id>222222</cl_id><phone>888888888</phone><name>Alt</name></contact_list>
</contact_lists>
</message>
</sms>';
$xml = simplexml_load_string($result, "SimpleXMLElement", LIBXML_NOCDATA);
$json = json_encode($xml);
$array = json_decode($json,true);
$contact_lists = $array['contact_lists']['contact_list'];
A
有时数组看起来像这样,这是可行的。
Array ( [status] => 0 [message] => Array ( ) [contact_lists] => Array ( [contact_list] => Array ( [0] => Array ( [cl_id] => 11111 [phone] => 999999999 [name] => Neu ) [1] => Array ( [cl_id] => 222222 [phone] => 888888888 [name] => Alt ) ) ) )
B
但有时如果数组只有一个 contact_list,它看起来像下面的
Array ( [status] => 0 [message] => Array ( ) [contact_lists] => Array ( [contact_list] => Array ( [cl_id] => 11111 [phone] => 999999999 [name] => Neu ) ) )
当我在 foreach 循环中使用 $contact_lists
时,它与 A
一起工作,因为有多个数组键,如 0、1、2 等...但是与 B
它显示错误 Warning: Illegal string offset 'name' etc..
因为没有像 0、1、2 等这样的数组键...
所以解析 xml 会自动删除导致问题的键编号。
1-如果只有一个数组,有没有办法保持键编号?
2- 尝试使用 if (count($contact_lists) >= 1) {
,但效果不佳..
有解决此类问题的方法吗?
解决方案:
$contact_lists_found = isset($array['contact_lists']['contact_list']) ? $array['contact_lists']['contact_list'] : '';
if ($contact_lists_found !== '' ) {
if (array_key_exists('0', $contact_lists_found)) {
// more than contact list
$contact_lists = $array['contact_lists']['contact_list'];
} else {
// only one contact list
$contact_lists[0] = $array['contact_lists']['contact_list'];
}
} else {
$contact_lists = array();
}
您可以检查是否设置了键 0
,如果没有,则简单地覆盖元素 contact_list
并将其自身包裹到一个数组中:
if(!isset($array['message']['contact_lists']['contact_list'][0])) {
$array['message']['contact_lists']['contact_list'] = [
$array['message']['contact_lists']['contact_list']
];
}
0
在 XML 中不是有效的标签名称,所以你永远不应该得到它,除非 XML 中有多个 <contact_list>
。
我正在解析 xml 如下:
$result = '
<sms>
<status>0</status>
<message>
<contact_lists>
<contact_list><cl_id>11111</cl_id><phone>999999999</phone><name>Neu</name></contact_list>
<contact_list><cl_id>222222</cl_id><phone>888888888</phone><name>Alt</name></contact_list>
</contact_lists>
</message>
</sms>';
$xml = simplexml_load_string($result, "SimpleXMLElement", LIBXML_NOCDATA);
$json = json_encode($xml);
$array = json_decode($json,true);
$contact_lists = $array['contact_lists']['contact_list'];
A
有时数组看起来像这样,这是可行的。
Array ( [status] => 0 [message] => Array ( ) [contact_lists] => Array ( [contact_list] => Array ( [0] => Array ( [cl_id] => 11111 [phone] => 999999999 [name] => Neu ) [1] => Array ( [cl_id] => 222222 [phone] => 888888888 [name] => Alt ) ) ) )
B
但有时如果数组只有一个 contact_list,它看起来像下面的
Array ( [status] => 0 [message] => Array ( ) [contact_lists] => Array ( [contact_list] => Array ( [cl_id] => 11111 [phone] => 999999999 [name] => Neu ) ) )
当我在 foreach 循环中使用 $contact_lists
时,它与 A
一起工作,因为有多个数组键,如 0、1、2 等...但是与 B
它显示错误 Warning: Illegal string offset 'name' etc..
因为没有像 0、1、2 等这样的数组键...
所以解析 xml 会自动删除导致问题的键编号。
1-如果只有一个数组,有没有办法保持键编号?
2- 尝试使用 if (count($contact_lists) >= 1) {
,但效果不佳..
有解决此类问题的方法吗?
解决方案:
$contact_lists_found = isset($array['contact_lists']['contact_list']) ? $array['contact_lists']['contact_list'] : '';
if ($contact_lists_found !== '' ) {
if (array_key_exists('0', $contact_lists_found)) {
// more than contact list
$contact_lists = $array['contact_lists']['contact_list'];
} else {
// only one contact list
$contact_lists[0] = $array['contact_lists']['contact_list'];
}
} else {
$contact_lists = array();
}
您可以检查是否设置了键 0
,如果没有,则简单地覆盖元素 contact_list
并将其自身包裹到一个数组中:
if(!isset($array['message']['contact_lists']['contact_list'][0])) {
$array['message']['contact_lists']['contact_list'] = [
$array['message']['contact_lists']['contact_list']
];
}
0
在 XML 中不是有效的标签名称,所以你永远不应该得到它,除非 XML 中有多个 <contact_list>
。