2012-07-02 113 views
2

我有下面的代码,为我的xml源文件中的每个RichText元素创建两个数组。其中一个数组用于具有前缀的属性,另一个数组用于没有任何前缀的属性。这是我能想出如何做到这一点的唯一方法:将两个数组合并到一个数组中

<?php 
$url = "http://testvipd7.scene7.com/is/agm/papermusepress/HOL_12_F_green?&fmt=fxgraw";  
$xml = simplexml_load_file($url);  
$xml->registerXPathNamespace('default', 'http://ns.adobe.com/fxg/2008'); 
$xml->registerXPathNamespace('s7', 'http://ns.adobe.com/S7FXG/2008'); 
$textNode = $xml->xpath("//default:RichText[@s7:elementID]"); 

function pr($var) { print '<pre>'; print_r($var); print '</pre>'; } 

$result = array(); 
$result1 = array(); 
foreach($textNode as $node){ 
    $result[] = $node->attributes('http://ns.adobe.com/S7FXG/2008'); 
    $result1[] = $node->attributes(); 

} 

$text = array_merge($result,$result1); 

pr($text); 

?> 

输出

Array 
(
    [0] => SimpleXMLElement Object 
     (
      [@attributes] => Array 
       (
        [caps] => none 
        [colorName] => 
        [colorValue] => #518269 
        [colorspace] => rgb 
        [elementID] => smalltext 
        [fill] => true 
        [fillOverprint] => false 
        [firstBaselineOffset] => ascent 
        [joints] => miter 
        [maxFontSize] => 11 
        [miterLimit] => 4 
        [referencePoint] => inherit 
        [rowCount] => 1 
        [rowGap] => 18 
        [rowMajorOrder] => true 
        [stroke] => false 
        [strokeOverprint] => false 
        [warpBend] => 0.5 
        [warpDirection] => horizontal 
        [warpHorizontalDistortion] => 0 
        [warpStyle] => none 
        [warpVerticalDistortion] => 0 
        [weight] => 1 
       ) 

     ) 

    [1] => SimpleXMLElement Object 
     (
      [@attributes] => Array 
       (
        [caps] => none 
        [colorName] => 
        [colorValue] => #518269 
        [colorspace] => rgb 
        [elementID] => largetext 
        [fill] => true 
        [fillOverprint] => false 
        [firstBaselineOffset] => ascent 
        [joints] => miter 
        [maxFontSize] => 19 
        [miterLimit] => 4 
        [referencePoint] => inherit 
        [rowCount] => 1 
        [rowGap] => 18 
        [rowMajorOrder] => true 
        [stroke] => false 
        [strokeOverprint] => false 
        [warpBend] => 0.5 
        [warpDirection] => horizontal 
        [warpHorizontalDistortion] => 0 
        [warpStyle] => none 
        [warpVerticalDistortion] => 0 
        [weight] => 1 
       ) 

     ) 

    [2] => SimpleXMLElement Object 
     (
      [@attributes] => Array 
       (
        [x] => 278.418 
        [y] => 115.542 
        [columnGap] => 18 
        [columnCount] => 1 
        [textAlign] => left 
        [fontFamily] => Trade Gothic LT Pro Bold Cn 
        [fontSize] => 11 
        [color] => #518269 
        [whiteSpaceCollapse] => preserve 
        [width] => 212.582 
        [height] => 33 
       ) 

     ) 

    [3] => SimpleXMLElement Object 
     (
      [@attributes] => Array 
       (
        [x] => 278.998 
        [y] => 86.7168 
        [columnGap] => 18 
        [columnCount] => 1 
        [textAlign] => left 
        [fontFamily] => Bootstrap 
        [fontSize] => 19 
        [color] => #518269 
        [whiteSpaceCollapse] => preserve 
        [trackingRight] => 4% 
        [width] => 240 
        [height] => 29 
       ) 

     ) 

) 

array_merge循环创建一个巨大的数组,有4个嵌套数组后。两个数组是RichText的默认属性,另外两个数组是具有s7:前缀的属性。但我需要的是$result$result1在foreach循环内合并,这样每个$textNode只有一个合并数组包含所有属性。因此,在这个例子中,我最终应该有两个数组,因为只有两个RichText元素。

这可能吗?

回答

2

代码的此位:

$text[] = array_merge($result,$result1); 

逻辑上属于你的foreach循环里面,我想你几乎知道。但是,它在那里不起作用。 SimpleXML喜欢返回可迭代的SimpleXMLElement对象,但它们本身不是数组,因此我们需要用其他方法替换array_merge

所以,这一切的一切:

$attributesByNode = array(); 

foreach($textNode as $node) { 
    $result1 = $node->attributes('http://ns.adobe.com/S7FXG/2008'); 
    $result2 = $node->attributes(); 

    foreach ($result1 as $attribName => $attributeValue) 
    { 
     $attributesByNode[$attribName] = $attribVal; 
    } 
    foreach ($result2 as $attribName => $attributeValue) 
    { 
     $attributesByNode[$attribName] = $attribVal; 
    } 
} 
+0

我做你的修改建议,当我做'的print_r($ attributesByNode);'我得到的是:'阵列([0] => [1] => )'。我的数据去了哪里? – thindery

+0

@thindery - 糟糕,SimpleXML不返回数组。固定。 –