За последние 24 часа нас посетили 24548 программистов и 1648 роботов. Сейчас ищут 925 программистов ...

XML parsing

Тема в разделе "PHP для новичков", создана пользователем WildZero, 20 дек 2010.

  1. WildZero

    WildZero Активный пользователь

    С нами с:
    24 фев 2010
    Сообщения:
    242
    Симпатии:
    0
    Адрес:
    Пермь
    Не хвататет мозга довести до ума:
    PHP:
    1.  
    2. <?
    3. $level=0;
    4. function xmlpars ($xml)
    5. {
    6.     global $level;
    7.     $parent = iconv("UTF-8","WINDOWS-1251",$xml->Группа->Ид);
    8.     foreach ($xml->Группа as $group)
    9.     {
    10.         if(isset($group->Группы))
    11.         {
    12.             $id = iconv("UTF-8","WINDOWS-1251",$group->Ид)."<br>";
    13.             $name = iconv("UTF-8","WINDOWS-1251",$group->Наименование)."<br>";
    14.             xmlpars($group->Группы);
    15.             echo $level++;
    16.         }
    17.         else
    18.         {
    19.             $id = iconv("UTF-8","WINDOWS-1251",$group->Ид);
    20.             $name = iconv("UTF-8","WINDOWS-1251",$group->Наименование);
    21.             if ($level == 0)
    22.             {
    23.             db_query ("SET CHARACTER SET CP1251");     
    24.             $query = "INSERT INTO `ss_categories` (`name`,`parent`,`1c-id`) VALUES ('".$name."','0','".$id."')";
    25.             db_query($query);
    26.             }
    27.         }
    28.     }
    29. }
    30.             $xmlall= simplexml_load_file($url);       //Интерпретирует XML-документ в объект
    31.             $group = $xmlall->Классификатор->Группы;
    32.             xmlpars ($group);
    33.  
    34. ?>
    35.  
    Что то напутано с уровнем вложености. Вернее не могу сообразить, по какому принципу обнулять $level.
    Подскажите в какую сторону двигаться?
     
  2. Carella

    Carella Активный пользователь

    С нами с:
    26 окт 2009
    Сообщения:
    35
    Симпатии:
    0
    Адрес:
    Челябинск
    Заменить foreach на for или while - так просто быстрее будет работать.

    Отказаться от global $level; - при работе с глоб. переменными очень сложно отслеживать их состояние. Лучше использовать локальную переменную и передавай ее как параметр в функции. Так хоть понятнее будет какие она значения и в какое момент цикла имеет. Подобные "косяки" весьма сложно искать, особенно если писал код сам (т.к. субъективно на него смотришь). Я обычно делаю так. Выключаю компьютер, беру листок бумаги и с нуля рисую блок схему этого процесса по всем правилам блок схем. И как только нарисую, сразу все понятно становится.