【问题标题】:converting xml into array, undesired array output将 xml 转换为数组,不需要的数组输出
【发布时间】:2011-06-21 17:25:29
【问题描述】:

我正在尝试将 xml 转换为关联数组。

  foreach($xml->children() as $child)
  {
  $ages[$child->getName()] = $child;
  }

但是当我打印出这个数组'ages'时,我得到的输出是

[Quagmire] => SimpleXMLElement Object
        (
            [0] => 30
        )

而不是

[Quagmire] => 30 

我要进行哪些更改才能获得所需的输出?

【问题讨论】:

    标签: php arrays simplexml


    【解决方案1】:

    您可以将子对象的值从 SimpleXML 对象显式转换为 int。

        $ages[$child->getName()] = (int)$child;
    

    【讨论】:

      【解决方案2】:

      是的,SimpleXML 对象的问题在于它们并不完全是对象。它们实际上是资源。这就是您遇到此问题的原因。几年前我在尝试序列化 XML 对象以供以后使用时遇到了这个问题。

      您需要做的是编写一个执行转换的函数。现在通常我会写一个,但事实证明 PHP 社区中有很多人已经解决了这个问题并将其发布在 php.net 网站上。

      以下代码来自http://www.php.net/manual/en/book.simplexml.php#97555

      <?php
      function objectsIntoArray($arrObjData, $arrSkipIndices = array())
      {
        $arrData = array();
      
        // if input is object, convert into array
        if (is_object($arrObjData))
          $arrObjData = get_object_vars($arrObjData);
      
        if (is_array($arrObjData))
        {
          foreach ($arrObjData as $index => $value)
          {
            if (is_object($value) || is_array($value))
              $value = objectsIntoArray($value, $arrSkipIndices); // recursive call
      
            if (in_array($index, $arrSkipIndices))
              continue;
      
            $arrData[$index] = $value;
          }
        }
      
        return $arrData;
      }
      ?>
      
      Usage:
      
      <?php
      $xmlUrl = "feed.xml"; // XML feed file/URL
      $xmlStr = file_get_contents($xmlUrl);
      $xmlObj = simplexml_load_string($xmlStr);
      $arrXml = objectsIntoArray($xmlObj);
      print_r($arrXml);
      ?>
      

      上面的代码被我稍微清理了一下。我对丑陋的代码感到恼火。无论如何,给它一个裂缝,祝你好运!

      -帕特里克

      【讨论】:

      • Array ( [name] =&gt; Quagmire [age] =&gt; 30 ) 不是 OP 要求的格式。还有simplexml_load_filefile_get_contentssimplexml_load_string
      • @brian_d 我会争论 simplexml_load_file 只是因为当您从 Microsoft 服务器获取 XML 提要时,使用 file_get_contents 会更好。出于某种原因,这些服务器添加了一些 file_get_contents 似乎可以很好处理但 simplexml_load_file 不能处理的额外内容。我是根据经验说的。至于格式,好的,所以我并没有完全关注这一点。我的主要意思是查看 PHP.net 文档通常可以找到已经为您编写的这些内容。
      猜你喜欢
      • 2021-06-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-03
      • 2011-12-25
      • 2015-09-03
      相关资源
      最近更新 更多