Разбор XML-документа в многомерный массив - PullRequest
0 голосов
/ 03 мая 2011

Я пытаюсь создать многомерный массив неограниченной глубины из файла XML. Я избавлю вас от причин и просто перейду к делу.

Я бы хотел, чтобы приведенный ниже код анализировал строку XML, вставляя все теги <item> и <nest> в массив. Любые теги <item>, находящиеся непосредственно под тегом <nest>, должны быть вставлены в массив, содержащийся в основном массиве.

При вызове recurisve я передал ключ в новый массив в качестве второго параметра, поэтому я ожидал, что он начнет добавлять элементы в этот новый массив. Однако это не так. Если бы кто-нибудь мог помочь мне решить проблему, я был бы признателен.

Код должен работать с простым C + P. Спасибо.

<code>class Parser
{
  static function subMenuRecursionArray($xml, $array = '', $itemcount = 1, $nestcount = 1)
  {
    foreach($xml->children() as $k => $v)
    {
        if ((string) $k == 'item')
        {
            $array["item$itemcount"]['text'] = (string) $v;
            $array["item$itemcount"]['command'] = (string) $v['command'];
            $itemcount++;
        }

        if ((string) $k == 'nest')
        {
            $array["nest$nestcount"] = array('name' => (string) $v['name'], 'items' => array());
            $nestcount++;

            self::subMenuRecursionArray($xml->nest, $array["nest".($nestcount-1)]['items'], $itemcount, $nestcount);
        }
    }
    return $array;
  }
}

$xml_fragment = '
<menu>
<item command="DefaultCommand">Main (Not nested 1)</item>
<item command="DefaultCommand">Main 2 (Not nested 2)</item>
<nest name="Cont">
    <item command="Contact">NESTED Contact 1</item>
    <item command="Contact">NESTED Contact 2</item>
  </nest>
</menu>';

$xml = simplexml_load_string($xml_fragment);
$array = Parser::subMenuRecursionArray($xml);
echo '<pre>' . print_r($array, 1) . '
';

1 Ответ

0 голосов
/ 03 мая 2011

Измените свой код на это - обратите внимание, что ваш вызов слишком subMenuRecursionArray возвращает массив, но вы никому его не назначаете - поэтому он просто потерян.

<code><?php
class Parser
{
  static function subMenuRecursionArray($xml, $array = '', $itemcount = 1, $nestcount = 1)
  {
    foreach($xml->children() as $k => $v)
    {
        if ((string) $k == 'item')
        {
            $array["item$itemcount"]['text'] = (string) $v;
            $array["item$itemcount"]['command'] = (string) $v['command'];
            $itemcount++;
        }

        if ((string) $k == 'nest')
        {
            $array["nest$nestcount"] = array('name' => (string) $v['name'], 'items' => array());
            $nestcount++;

            $array["nest$nestcount"]['items'] = self::subMenuRecursionArray($xml->nest, $array["nest".($nestcount-1)]['items'], $itemcount, $nestcount);
        }
    }
    return $array;
  }
}

$xml_fragment = '
<menu>
<item command="DefaultCommand">Main (Not nested 1)</item>
<item command="DefaultCommand">Main 2 (Not nested 2)</item>
<nest name="Cont">
    <item command="Contact">NESTED Contact 1</item>
    <item command="Contact">NESTED Contact 2</item>
  </nest>
</menu>';

$xml = simplexml_load_string($xml_fragment);
$array = Parser::subMenuRecursionArray($xml);
echo '<pre>' . print_r($array, 1) . '
'; ?>
...