0

嗨,伙计们,我正在尝试编写一个函数,该函数将使用 simplexml 将 xml 转换为数组。我知道那里已经编写了一些函数,但我需要自己编写。这个 xml 只是一个例子,可能是不同的格式,所以我需要这个函数与任何类型的 xml 结构一起使用,基本上遍历所有标签并循环遍历所有级别的所有标签并创建数组。

这是我的 xml 的样子

   <approval id='x34445454'>
       <p_data>
    <p_wide>3.5</p_wide>
    <p_hieight>2</p_hieight>
       </p_data>
     <bars></bars>
    <timer>
    <loc_time>
        <year>2013</year>
        <month>4</month>
        <day>2</day>
    </loc_time>
    <start>
        <year>2013</year>
        <month>04</month>
        <day>02</day>
    </start>
    <end>
        <year>2013</year>
        <month>04</month>
        <day>09</day>
    </end>
</timer>
<customer_data>
    <custid>8789</custid>
    <email>myemail@gmail.com</email>
    <description>Some item description</description>
    <optout>false</optout>
</customer_data>
<large>2</large>
<job name='ord1'>
    <guides></guides>

    <preview>
        <type>mytpe</type>
        <info_message></info_message>
        <label>both</label>
        <index>100</index>
        <imagebox>
            <data>703.448275862069</data>
            <height>11.068965517241</height>
            <shift>0</shift>
        </imagebox>
        <OK_Screen></OK_Screen>
    </preview_file>
    <preview_file>
        <type>mytpe3</type>
        <info_message></info_message>
        <label>sides</label>
        <index>100</index>
        <imagebox>
            <data>111.448275862069</data>
            <height>11.554</height>
            <shift>0</shift>
        </imagebox>
        <OK_Screen></OK_Screen>
    </preview>
</job>

<job name='ord1'>
    <guides></guides>

    <preview>
        <type>mytpe</type>
        <info_message></info_message>
        <label>both</label>
        <index>100</index>
        <imagebox>
            <data>703.448275862069</data>
            <height>11.068965517241</height>
            <shift>0</shift>
        </imagebox>
        <OK_Screen></OK_Screen>
    </preview_file>
    <preview_file>
        <type>mytpe3</type>
        <info_message></info_message>
        <label>sides</label>
        <index>100</index>
        <imagebox>
            <data>111.448275862069</data>
            <height>11.554</height>
            <shift>0</shift>
        </imagebox>
        <OK_Screen></OK_Screen>
    </preview>
</job>

到目前为止 iv 写了这个函数

  function xmltest($xml) {
      $arr = array();

foreach($xml as $element) {
    $arr[$element->getName()]=array();
    foreach($element->attributes() as $key=>$value) {
        $arr[$element->getName()][$key]=(string)$value;
    }

    foreach($element as $key=>$value) {
       $arr[$element->getName()][$key]=array();

        if(!$value->children() && (!empty($value))) {
            $arr[$element->getName()][$key]=(string)$value;
        } 


    }

  }

  return $arr;


}

这是返回

   Array
  (
[approval] => Array
    (
        [id] => x34445454
        [p_data] => Array
            (
            )

        [bars] => Array
            (
            )

        [timer] => Array
            (
            )

        [customer_data] => Array
            (
            )

        [large] => 2
        [job] => Array
            (
            )

    )

)

这很棒,但现在我需要不断循环并添加所有标签,直到没有更多标签为止。

4

1 回答 1

0

这是我有时使用的一个功能:

public function xmlToArray( $xmlObject, $out = array () )
{
        foreach ( (array) $xmlObject as $index => $node )
            $out[$index] = ( is_object ( $node ) ) ? $this->xmlToArray( $node ) : $node;

        return $out;
}
于 2013-04-04T16:36:17.027 回答