我有以下代码,为 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
只有一个合并数组> 包含所有属性。因此,在这个示例 url 中,我最后应该有两个数组,因为只有两个 RichText
元素。
这可能吗?
最佳答案
你的这段代码:
$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;
}
}
关于php - 将两个数组合并为一个数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11297407/