0

我有一个需要使用 SimpleXML 将其转换为 XML 的数组。下面的方法几乎可以完成工作,但有一个问题。它不能生成这样的结构:

    $xmlFields = array(  
        'rootElt' => array(
            'field1' => '',
            'field2' => '',                
            'field3' => array(                  
                'field4'  => array(
                    'income' => array(
                        'owner' => '',                            
                        'description' => '', 
                    ),
                    'income' => array(
                        'owner' => '',                            
                        'description' => '', 
                    ),
                ),
            )
        )
    );

它只写“field4”部分的最后一个“收入”,但我需要如下输出:

<field4>
    <income>
        <owner>....</owner>            
        <description>....</description>
    </income>
    <income>
        <owner>....</owner>            
        <description>....</description>
    </income>
</field4>

有人可以帮我修复这个功能:

/**     
 * @param array $dataArr
 * @param SimpleXMLElement $xmlObj 
 */
private function array2xml( $dataArr, $xmlObj ) {
    foreach ( $dataArr as $key => $value ) {          
        if ( is_array($value) ) {                        
            if ( !is_numeric($key) ) {                    
                $subnode = $xmlObj->addChild( $key );                    
                self::array2xml( $value, $subnode );                    
            } else {                                        
                self::array2xml( $value, $xmlObj );      
            }
        } else {
            $xmlObj->addChild( $key, $value );                       
        }
    }
}
4

1 回答 1

1

代码在 SimpleXML 方面看起来不错,但是您对数组在 PHP 中的工作方式存在误解:

'field4'  => array(
    'income' => array(
        'owner' => '',                            
        'description' => '', 
    ),
    'income' => array(
        'owner' => '',                            
        'description' => '', 
    ),

这不是向field4数组添加两个值,而是一个。请参阅http://php.net/array,例如Example #2。键的第二个定义income替换了第一个。

在这种情况下,您可能想要做的是对数组使用不同的结构:

'field4'  => array(
    array('income' => array(
        'owner' => '',                            
        'description' => '', 
    )),
    array('income' => array(
        'owner' => '',                            
        'description' => '', 
    )),

如果您将每个元素包装在它自己的数组元素中,您的代码甚至不会有任何特殊情况,因为每个元素都是相同的。但是,这意味着您将 - 如果您手动创建数组 - 编写更多代码来定义它。

想到的另一种选择是:

'field4'  => array(
    'income' => array(
        array(
            'owner' => '',                            
            'description' => '', 
        ),
        array(
            'owner' => '',                            
            'description' => '', 
        ),            
    ),

这仍然不允许您拥有多个具有相同元素名称的组,但编写它可能会更容易。

对于后面的数组结构(我认为这就是您想要使用的),我创建了一个 simplexml 数组导入器/转换器(Gist)。其基本形式的用法非常简单,但您可以用它做更多差异化的事情:

/* Example 1: Create a new SimpleXMLElement based on an array */

$import = new SimpleXMLArrayImport();

$xml = $import->importArray(['root' => '']);

/* <?xml version="1.0"?>
 * <root/>                                                    */

/* Example 2: Add an empty child element to the root          */

$new = $import->addArray($xml, ['numbers' => '']);

/* <?xml version="1.0"?>
 * <root>
 *   <numbers/>
 * </root>                                                    */

/* Example 3: Add a list of same-named elements to the root   */

$last = $import->addArray($new, ['number' => [0, 1, 42]]);

/* <?xml version="1.0"?>
 * <root>
 *     <numbers>
 *         <number>0</number>
 *         <number>1</number>
 *         <number>42</number>
 *     </numbers>
 * </root>                                                    */

/* Example 4: Set attribute of last added element             */

$last['note'] = 'The Answer to the Ultimate Question of Life, the Universe, and Everything';

/* <?xml version="1.0"?>
 * <root>
 *   <numbers>
 *     <number>0</number>
 *     <number>1</number>
 *     <number note="The Answer to the ...">42</number>
 *   </numbers>
 * </root>                                                    */

/* Example 5: Create a full document                          */

$xmlFields = array(
    'rootElt' => array(
        'field1' => '',
        'field2' => '',
        'field3' => array(
            'field4' => array(
                'income' => array(
                    array(
                        'owner'       => '',
                        'description' => '',
                    ),
                    array(
                        'owner'       => '',
                        'description' => '',
                    ),
                ),
            ),
        )
    )
);

$import = new SimpleXMLArrayImport($xmlFields);

$xml = $import->getDocument(); # The SimpleXML Root Element

/* <?xml version="1.0"?>
 * <rootElt>
 *   <field1/>
 *   <field2/>
 *   <field3>
 *     <field4>
 *       <income>
 *         <owner/>
 *         <description/>
 *       </income>
 *       <income>
 *         <owner/>
 *         <description/>
 *       </income>
 *     </field4>
 *   </field3>
 * </rootElt>                                                 */
于 2012-11-04T14:24:12.643 回答