【发布时间】:2019-09-06 22:22:32
【问题描述】:
xml to array - remove empty array php也有同样的问题 不知道你怎么处理这个。我的意思是我怎样才能得到一个不是我的问题的答案,并且问 > 2 年前。 所以我在这里问我自己的问题:
简单脚本:
$xml
= '<?xml version="1.0"?>
<Envelope>
<foo>
<bar>
<baz>Hello</baz>
<bat/>
</bar>
</foo>
<foo>
<bar>
<baz>Hello Again</baz>
<bat></bat>
</bar>
</foo>
<foo>
<bar>
<baz>Hello Again</baz>
<bat> </bat>
</bar>
</foo>
</Envelope>';
$xml = new \SimpleXMLElement(
$xml,
LIBXML_NOBLANKS | LIBXML_NOEMPTYTAG | LIBXML_NOCDATA
);
$array = json_decode(json_encode((array)$xml), true);
// [
// 'foo' => [
// 0 => [
// 'bar' => [
// 'baz' => 'Hello',
// 'bat' => [], <<-- how to get this to NULL
// ],
// ],
// 1 => [
// 'bar' => [
// 'baz' => 'Hello Again',
// 'bat' => [], <<-- how to get this to NULL
// ],
// ],
// 2 => [
// 'bar' => [
// 'baz' => 'Hello Again',
// 'bat' => [ <<-- how to get this to NULL
// 0 => ' ', or at least to value of " " without array
// ],
// ],
// ],
// ],
// ];
如您所见,<bat/> 标记为空,最后一个 <bat> </bat> 标记中有一个空格。
我想把这些放到数组中的null。
我尝试了以下方法,但这仅适用于第一级 ofc:
$data = (array)$xml;
foreach ($data as &$item) {
if (
$item instanceof \SimpleXMLElement
and $item->count() === 0
) {
// is a object(SimpleXMLElement)#1 (0) {}
$item = null;
}
}
我尝试递归执行此操作但失败了。
也试过RecursiveIteratorIterator但失败了。
但必须有办法让这些偏移量达到null。
以前有人做过吗?
编辑
【问题讨论】:
-
每次我看到有人试图编写一个通用的 XML 到数组的函数,特别是当它以像
$array = json_decode(json_encode((array)$xml), true);这样的 hack 开头时,我感到绝望。与其在通用算法给出“错误”答案的所有情况下跳入特殊情况,不如使用 XML 解析器(如 SimpleXML)来访问您实际需要的数据,并创建一个数组(或预定义对象)这对您的实际应用很有意义。
标签: php arrays xml recursion simplexml