Динамические имена элементов

В PHP 5.6 и выше вы можете сгладить двухмерные массивы с помощью array_merge после распаковки внешнего массива с помощью оператора .... Код прост и понятен.

$a = [[10, 20], [30, 40]];
$b = [["x" => "X", "y" => "Y"], ["p" => "P", "q" => "Q"]];

print_r(array_merge(...$a));
print_r(array_merge(...$b));

Array
(
    [0] => 10
    [1] => 20
    [2] => 30
    [3] => 40
)
Array
(
    [x] => X
    [y] => Y
    [p] => P
    [q] => Q
)

Но он не работает, когда внешний массив имеет не числовые клавиши. В этом случае вам сначала нужно вызвать array_values.

$c = ["a" => ["x" => "X", "y" => "Y"], "b" => ["p" => "P", "q" => "Q"]];
print_r(array_merge(...array_values($c)));

Array
(
    [x] => X
    [y] => Y
    [p] => P
    [q] => Q
)
14
задан Mathias Müller 21 March 2014 в 16:06
поделиться

1 ответ

Вероятно, пространство имен выходит и возможно один с текущим контекстом. Для источника (с добавленным объявлением пространства имен для создания его правильно построенным xml)

<svc:ElementList xmlns:svc="svc">
  <svc:Element>
    <Year>2007</Year>
  </svc:Element>
  <svc:Element>
    <Year>2006</Year>
  </svc:Element>
  <svc:Element>
    <Year>2005</Year>
  </svc:Element>
</svc:ElementList>

таблица стилей

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:svc="svc"
                version="1.0">
  <xsl:template match="svc:ElementList">
    <xsl:element name="{local-name()}">
      <xsl:for-each select="svc:Element">
        <xsl:element name="{concat('NewTag', Year)}"/>
      </xsl:for-each>
    </xsl:element>
  </xsl:template> 
</xsl:stylesheet>

даст Вам вывод, в котором Вы нуждаетесь. Обратите внимание, что svc:Element потребности, которые будут выбраны с помощью снабженного префиксом пространства имен, и что контекст при генерации новых тегов svc:Element, не svc:ElementList.

13
ответ дан jelovirt 21 March 2014 в 16:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: