0

SimpleXML を使用して XML に変換する必要がある配列があります。以下の方法はほとんどの作業を行っていますが、1 つ問題があります。次のような構造を生成することはできません。

    $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配列に 2 つの値を追加するのではなく、1 つの値を追加することです。例 #2など、http://php.net/arrayを参照してください。キーの 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 に答える