Как создать рекурсивную функцию во вложенном XML - PHP - PullRequest
0 голосов
/ 29 марта 2012


Привет

есть ли у кого-то опыт работы с рекурсивными функциями?

Я пытаюсь разобрать XML-файл на объекты (в PHP) (для последующего использования в drupal) Код, который я пишу, после первого «дочернего» узла практически всегда одинаков (см. Ниже). единственные две вещи, которые изменяются, это ссылка из xpath (что не должно быть таким сложным) и создание динамической переменной-объекта (если таковая существует).

Код для первого предмета (все это курс)

'$ item-> identif <- известен, потому что вы находитесь в foreach </p>

$ resulty = $ xpaths-> xpath ("/ org.olat.course.Structure / rootNode / children / [идент = '$ item-> идент.'] / children / [type = 'st' или type = 'sp' или type = 'BC'] ");

foreach ($resulty as $itemy) {

   $SubjectObject = new subject();

// isnt 100% correct but doesn't matter now

   $SubjectObject->getSubjectFolders($FolderObject);

  $SubjectObject->setSubjectId(isset($item->SubjectId) ? (string) $item->SubjectId: null);
  $SubjectObject->setSubjectShortTitle(isset($item->SubjectName) ? (string) $item->SubjectName: null);

  $ChapterObject->setSubject($SubjectObject);
 }

Теперь - если я хочу получить предмет из предмета из предмета из курса, то это будет

$ resulty = $ xpaths-> xpath ("/ org.olat.course.Structure / rootNode / children / [ident = '$ item-> identif'] / children / [type = ' st 'or type =' sp 'или type =' bc '] ");

foreach ($resulty as $itemy) {

   $SubjectObject = new subject();

   $SubjectObject->getSubjectFolders($FolderObject);

  $SubjectObject->setSubjectId(isset($itemy->SubjectId) ? (string) $itemy->SubjectId: null);
  $SubjectObject->setSubjectShortTitle(isset($itemy->SubjectName) ? (string) $itemy->SubjectName: null);

        $resultz = $xpaths->xpath("/org.olat.course.Structure/rootNode/children/*[ident = '$item->ident']children/*[ident = '$itemy->ident']/children/*[type = 'st' or type = 'sp' or type = 'bc']");

            foreach ($resultz as $itemz) {

               $SubSubjectObject = new subject();

               $SubSubjectObject->getSubjectFolders($FolderObject);

              $SubSubjectObject->setSubjectId(isset($itemz->SubjectId) ? (string) $itemz->SubjectId: null);
              $SubSubjectObject->setSubjectShortTitle(isset($itemz->SubjectName) ? (string) $itemz->SubjectName: null);



                            $resulta = $xpaths->xpath("/org.olat.course.Structure/rootNode/children/*[ident = '$item->ident']/children/*[ident = '$itemy->ident']/children/*[ident = '$itemz->ident']/children/*[type = 'st' or type = 'sp' or type = 'bc']");

                                foreach ($resulta as $itema) {

                                   $SubSubSubSubjectObject= new subject();

                                   $SubSubSubSubjectObject->getSubjectFolders($FolderObject);

                                  $SubSubSubSubjectObject->setSubjectId(isset($itema->SubjectId) ? (string) $itema->SubjectId: null);
                                  $SubSubSubSubjectObject->setSubjectShortTitle(isset($itema->SubjectName) ? (string) $itema->SubjectName: null);


                                                  (and so on)


                                  $SubSubSubjectObject->setSubject($SubSubSubSubjectObject);
                                 }



              $SubjectObject->setSubject($SubSubjectObject);

          }


  $ChapterObject->setSubject($SubjectObject);

}

вот дерево xml (пример)

<Structure>

    <rootnode>

        <CursusName>History</CursusName>
        <CursusId>100001</CursusId>
        <children>

            <childNode>

                 <SubjectName>World War 1</SubjectName>
                <SubjectId>100002</SubjectId>
                <children>

                    <childNode>

                         <SubjectName>World War 1.1</SubjectName>
                        <SubjectId>100016</SubjectId>
                        <children>

                            <childNode>

                                 <SubjectName>World War 1.1.1</SubjectName>
                                <SubjectId>100032</SubjectId>
                                <children>

                                    <childNode>

                                         <SubjectName>World War 1.1.1.1</SubjectName>
                                        <SubjectId>100065</SubjectId>
                                        </children>

                                    </childNode>

                                </children>
                                +<children></children>

                            </childNode>

                        </children>
                        +<children></children>

                    </childNode>
                    +<childNode></childNode>

                </children>
                +<children></children>

            </childNode>
            +<childNode></childNode>
            +<childNode></childNode>

        </children>
        +<visibility></visibility>
        +<accessibility></accessibility>

    </rootnode>
    <version>1</version>

</Structure>

SO

Может кто-нибудь помочь мне? Кто-нибудь знает, как я могу решить проблему с объектами? своего рода цикл foreach / while, который создает объекты? и доставить их в родительский объект?

извините за длинный пост и все эти строки кода

С уважением

Дитер

С уважением

1 Ответ

0 голосов
/ 29 марта 2012
function recurseResults($resulty)
{
    foreach ($resulty as $itemy) 
    {
        $SubjectObject = new subject();
        $SubjectObject->getSubjectFolders($FolderObject);
        $SubjectObject->setSubjectId(isset($itemy->SubjectId) ? (string) $itemy->SubjectId: null);
        $SubjectObject->setSubjectShortTitle(isset($itemy->SubjectName) ? (string) $itemy->SubjectName: null);
        $resultz = $xpaths->xpath("/org.olat.course.Structure/rootNode/children/*[ident = '$item->ident']children/*[ident = '$itemy->ident']/children/*[type = 'st' or type = 'sp' or type = 'bc']");
        // __save my new subject somewhere__
        recurseResults($resultz);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...