从使用simplexml生成的多维数组中删除空数组

时间:2017-03-30 08:36:34

标签: php arrays xml multidimensional-array simplexml

我有一个xml文件,结构如下:

onClick={clickButton.bind(this, event, someArgument)}

现在我正在加载此文件并创建一个数组:

<categories>
  <category>
    <id>3</id>
    <title><![CDATA[Testname]]></title>
    <text><![CDATA[]]></text>
    <keywords><![CDATA[]]></keywords>
    <description><![CDATA[]]></description>
  </category>
</categories>

这会生成以下结果(print_r输出):

$xmlData = simplexml_load_file( 'categories.xml', null, LIBXML_NOCDATA);
$array = json_decode(json_encode($xmlData), true);

这是我的问题,我怎么能删除那些空数组?我尝试使用数组过滤器,但这不起作用。 (我需要钥匙,但它们应该是空的)

我知道会有一种方法,在我的下一步中,我根据需要重命名数组键,我可以在foreach循环中检查空数组,但我认为有一种更简单的方法,因为每个字段(除了id)在xml文件中可能为空。

Array
(
  [@attributes] => Array
    (
      [version] => 1.0
    )

  [categories] => Array
    (
      [category] => Array
        (
          [0] => Array
            (
              [id] => 3
              [title] => Testname
              [text] => Array
                (
                )

              [keywords] => Array
                (
                )

              [description] => Array
                (
                )
            )
        )
    )
)

有人有想法,我在json_decode之后可以做些什么?或者,对于我想要在这里完成的所有事情,还有一种更简单的方法吗?

谢谢!

2 个答案:

答案 0 :(得分:2)

每当我看到有人使用json_decode(json_encode())黑客时,就会让我感到难过。您不需要将SimpleXML对象转换为数组以循环它,只需阅读the usage examples in the manual

如果直接遍历SimpleXML对象,则永远不会获得这些数组,因此永远不需要删除它们:

$xmlData = simplexml_load_file('categories.xml'); // LIBXML_NOCDATA is NOT needed
foreach($xmlData->categories->category as $key => $category){
  $results[$key]['id'] = (string)$category->id;
  $results[$key]['headline'] = (string)$category->title;
  $results[$key]['content'] = (string)$category->text;
  $results[$key]['metaKeywords'] = (string)$category->keywords;
  $results[$key]['metaDescription'] = (string)$category->description;
}

(string)告诉SimpleXML你想要特定元素(包括CDATA)的文本内容,并为空元素提供一个空字符串。

答案 1 :(得分:0)

希望这会奏效。 PHP code demo

<?php
$result=Array
(

  "categories" => Array
    (
      "category" => Array
        (
          0 => Array
            (
              "id" => 3,
              "title" => "Testname",
              "text" => Array
                (
                ),

              "keywords" => Array
                (
                ),

              "description" => Array
                (
                )
            )
        )
    )
);
$results=array();
foreach($result['categories']['category'] as $key => $category){
  $results[$key]['id'] = $category['id'];
  $results[$key]['headline'] = $category['title'];
  $results[$key]['content'] = is_array($category['text']) && count($category['text'])>0 ? $category['text'] : false;
  $results[$key]['metaKeywords'] = is_array($category['keywords']) && count($category['keywords'])>0 ? $category['keywords'] : false;
  $results[$key]['metaDescription'] = is_array($category['description']) && count($category['description'])>0 ? $category['description'] : false;
  $results[$key]=array_filter($results[$key]);
}
print_r($results);