Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Как сделать рекурсию?
 
 автор: Владимир55   (23.12.2012 в 12:23)   письмо автору
 
 

Производится разбор xml-файла, содержимое которого приведено ниже. Там есть раздел <Группы>, в котором содержатся 1 и более <Группа>. А в <Группа> могут быть вложены и другие подразделы: <Группы>.
Похоже, что без рекурсии не обойтись.

Одну строку я извлекаю так:
<?php
$xml 
simplexml_load_file("import.xml");
if (
$xml) {
foreach (
$xml->Классификатор->Группы[0] as $item) {
            echo (string) 
$item->Наименование[0], '[', (string) $item->Ид[0], '] '"\n";
        } 
}


А как сделать рекурсию, чтобы извлечь пары ИД-Наимеование с информацией о том, какая группа в какую вложена?

<?xml version="1.0" encoding="utf-8"?>
<КоммерческаяИнформация ВерсияСхемы="2.04" ДатаФормирования="2012-12-20T21:41:34"><Классификатор>
 
<Группы>
<Группа>
<Ид>F6FF40B4-556F-E943-DCAF-0BCE308FEBEF</Ид>
<Наименование>Первая группа</Наименование>
<Описание></Описание>
 
<Группы>
<Группа>
<Ид>CDC01E36-BE83-B77F-93C7-7D3C4BF709ED</Ид>
<Наименование>Овощи</Наименование>
<Описание></Описание>
</Группа>
</Группы>
 
<Группы>
<Группа>
<Ид>7645A435-77DD-B2C6-421B-63A178DDB760</Ид>
<Наименование>Фрукты</Наименование>
<Описание></Описание>
<Группы>
 
<Группа>
<Ид>A183F863-22F9-4410-B4AF-5BCF1EB8CBB9</Ид>
<Наименование>Африканские</Наименование>
<Описание></Описание>
<Группы>
<Группа>
<Ид>427D57BD-862C-0A88-EDC2-FED3B9CE77D2</Ид>
<Наименование>Национальные</Наименование>
<Описание></Описание>
</Группа>
</Группы> 
</Группа>
</Группы>
</Группа>
</Группы>
</Группа>
</Группы>
<Группы>
<Группа>
<Ид>A9678AEC-859C-0FE4-51A3-DFE0B7F251C3</Ид>
<Наименование>Вторая группа</Наименование>
<Описание></Описание>
</Группа>
</Группы>
</Классификатор>
 
<Каталог>
<Товары>
  
</Товары>
</Каталог>
</КоммерческаяИнформация>

  Ответить  
 
 автор: Sfinks   (23.12.2012 в 15:21)   письмо автору
 
   для: Владимир55   (23.12.2012 в 12:23)
 

Выведите после $xml = simplexml_load_file("import.xml");
echo'<pre>';print_r($xml);echo'</pre>';
, чтоб понятней было с чем дело имеем....

  Ответить  
 
 автор: Владимир55   (23.12.2012 в 16:12)   письмо автору
8.7 Кб
 
   для: Sfinks   (23.12.2012 в 15:21)
 

Я тоже начал с этого листинга и таким образом разобрался с товаром. Сейчас, чтобы не загромождать и без того большой текст, товар удален, ибо в каталоге его может и не быть, но структкра должна сохраняться.

В качестве дубля этот же листинг во вложении.

SimpleXMLElement Object
(
    [@attributes] => Array
        (
            [ВерсияСхемы] => 2.04
            [ДатаФормирования] => 2012-12-20T21:41:34
        )

    [Классификатор] => SimpleXMLElement Object
        (
            [Группы] => Array
                (
                    [0] => SimpleXMLElement Object
                        (
                            [Группа] => SimpleXMLElement Object
                                (
                                    [Ид] => F6FF40B4-556F-E943-DCAF-0BCE308FEBEF
                                    [Наименование] => Первая группа
                                    [Описание] => SimpleXMLElement Object
                                        (
                                        )

                                    [Группы] => Array
                                        (
                                            [0] => SimpleXMLElement Object
                                                (
                                                    [Группа] => SimpleXMLElement Object
                                                        (
                                                            [Ид] => CDC01E36-BE83-B77F-93C7-7D3C4BF709ED
                                                            [Наименование] => Овощи
                                                            [Описание] => SimpleXMLElement Object
                                                                (
                                                                )

                                                        )

                                                )

                                            [1] => SimpleXMLElement Object
                                                (
                                                    [Группа] => SimpleXMLElement Object
                                                        (
                                                            [Ид] => 7645A435-77DD-B2C6-421B-63A178DDB760
                                                            [Наименование] => Фрукты
                                                            [Описание] => SimpleXMLElement Object
                                                                (
                                                                )

                                                            [Группы] => SimpleXMLElement Object
                                                                (
                                                                    [Группа] => SimpleXMLElement Object
                                                                        (
                                                                            [Ид] => A183F863-22F9-4410-B4AF-5BCF1EB8CBB9
                                                                            [Наименование] => Африканские
                                                                            [Описание] => SimpleXMLElement Object
                                                                                (
                                                                                )

                                                                            [Группы] => SimpleXMLElement Object
                                                                                (
                                                                                    [Группа] => SimpleXMLElement Object
                                                                                        (
                                                                                            [Ид] => 427D57BD-862C-0A88-EDC2-FED3B9CE77D2
                                                                                            [Наименование] => Национальные
                                                                                            [Описание] => SimpleXMLElement Object
                                                                                                (
                                                                                                )

                                                                                        )

                                                                                )

                                                                        )

                                                                )

                                                        )

                                                )

                                        )

                                )

                        )

                    [1] => SimpleXMLElement Object
                        (
                            [Группа] => SimpleXMLElement Object
                                (
                                    [Ид] => A9678AEC-859C-0FE4-51A3-DFE0B7F251C3
                                    [Наименование] => Вторая группа
                                    [Описание] => SimpleXMLElement Object
                                        (
                                        )

                                )

                        )

                )

        )

    [Каталог] => SimpleXMLElement Object
        (
            [Товары] => SimpleXMLElement Object
                (
                    [Товар] => Array
                        (
                            [0] => SimpleXMLElement Object
                                (
                                    [Ид] => 8D9E1B8C-4C64-B314-2159-65A8828743C9
                                    [Артикул] => 855466524
                                    [Наименование] => Комплект МСК 
                                    [Описание] => SimpleXMLElement Object
                                        (
                                        )

                                    [БазоваяЕдиница] => SimpleXMLElement Object
                                        (
                                            [@attributes] => Array
                                                (
                                                    [НаименованиеПолное] => 
                                                )

                                        )

                                    [Группы] => SimpleXMLElement Object
                                        (
                                            [Ид] => F6FF40B4-556F-E943-DCAF-0BCE308FEBEF
                                        )

                                )

                            [1] => SimpleXMLElement Object
                                (
                                    [Ид] => B4139568-8973-5BD8-3F3A-4D68ACACFF33
                                    [Артикул] => 855466524
                                    [Наименование] => S-Class 3,0L 
                                    [Описание] => SimpleXMLElement Object
                                        (
                                        )

                                    [БазоваяЕдиница] => SimpleXMLElement Object
                                        (
                                            [@attributes] => Array
                                                (
                                                    [НаименованиеПолное] => 
                                                )

                                        )

                                    [Группы] => SimpleXMLElement Object
                                        (
                                            [Ид] => 427D57BD-862C-0A88-EDC2-FED3B9CE77D2
                                        )

                                )

                        )

                )

        )

)

  Ответить  
 
 автор: Sfinks   (31.12.2012 в 14:09)   письмо автору
 
   для: Владимир55   (23.12.2012 в 16:12)
 

<?php
  
function recurs$arr$base=''$level=)
    {
    foreach( 
$arr as $val )
      if(  
key_exists'Группа'$val)
        && 
key_exists'Наименование'$val['Группа'] )
        ){
        echo 
'<br>'.str_repeat('&nbsp;',$level).$base.'/'.$val['Группа']['Наименование'];
        if( 
key_exists'Ид'$val['Группа'] ) ) echo '<br>'.str_repeat('&nbsp;',$level).'&nbsp;&nbsp;Ид: '.$val['Группа']['Ид'];
        if( 
key_exists'Группы'$val['Группа'] ) ) recurs$val['Группа']['Группы'], $base.'/'.$val['Группа']['Наименование'], $level+);
        }
    }
  
recurs$xml['Классификатор']['Группы'] );
?>
кажись так.

  Ответить  
 
 автор: Владимир55   (03.01.2013 в 18:40)   письмо автору
817 байт
 
   для: Sfinks   (31.12.2012 в 14:09)
 

К сожалению, этот код не работает... Вообще ничего не выводит. Можете попробовать сами - файл каталога во вложении.

Сложная какая-то рекурсия получается. Пробовал и так - тоже не пашет:

<?php
function my_func (SimpleXMLElement $el)
{
    if (
count($el->children() ))  {

        foreach(
$el->children() as $ch) {

            if (
$ch->getName() == 'Группа') {

                echo (string) 
$el->Наименование[0], '[', (string) $el->Ид[0], '] '"\n";
            }
            
my_func($ch);
        }
    }
}

if ((
$xml simplexml_load_file("import.xml"))) 
{   
      
my_func($xml);
}

  Ответить  
 
 автор: Владимир55   (03.01.2013 в 22:13)   письмо автору
 
   для: Владимир55   (03.01.2013 в 18:40)
 

Проблема разрешилась.

Спасибо!

  Ответить  
 
 автор: Sfinks   (03.01.2013 в 22:20)   письмо автору
 
   для: Владимир55   (03.01.2013 в 22:13)
 

А я только хотел написать что чуть попозже поковыряюсь =)

  Ответить  
 
 автор: Владимир55   (04.01.2013 в 19:14)   письмо автору
33.8 Кб
 
   для: Sfinks   (03.01.2013 в 22:20)
 

Все же меня несколько смущает, что в составленной функции закрывающиеся скобки как-бы выходят за ее пределы.

В принципе, количество открывающихся и закрывающихся скобок совпадает, но написание какое-то нетрадиционное.

Как на Ваш взгляд?

(выходными параметрами являются массивы $m_adres_grupp, $m_guid_grupp).

<?php

        
function func_grupp (SimpleXMLElement $el$r)
        {
            global 
$m_adres_grupp$m_guid_grupp;

            if (
count($el->children() ))
            {

                foreach(
$el->children() as $ch)
                {
                    
$tmp_arr $r;
                    if (
strpos($ch->getName(), 'Группа') === 0)
                    {
                        
$tmp_arr[] = $ch->
                        {
'Наименование'};
                         
// echo implode('/', $tmp_arr), ' [', $ch->{'Ид'}, "]\n <br />";

                        
$m_adres_grupp[] = implode('/'$tmp_arr);
                        
$m_guid_grupp[]  = $ch->{'Ид'};
                }
                        
func_grupp($ch$tmp_arr);
            }
        }
                        }
                        
        
func_grupp(simplexml_load_file('commerce/import.xml'), array());    


В редакторе (вложение) особенно хорошо видно, что вышла за пределы функции последняя скобка.

  Ответить  
 
 автор: Sfinks   (06.01.2013 в 02:26)   письмо автору
 
   для: Владимир55   (04.01.2013 в 19:14)
 

Вы о форматировании кода чтоль?
А что мешает подвинуть скобки?
function func_grupp (SimpleXMLElement $el, $r) 

    global $m_adres_grupp, $m_guid_grupp; 
    if (count($el->children() )) 
    { 
        foreach($el->children() as $ch) 
        { 
            $tmp_arr = $r; 
            if (strpos($ch->getName(), 'Группа') === 0) 
            { 
                $tmp_arr[] = $ch->{'Наименование'}; 
                 // echo implode('/', $tmp_arr), ' [', $ch->{'Ид'}, "]\n <br />"; 

                $m_adres_grupp[] = implode('/', $tmp_arr); 
                $m_guid_grupp[]  = $ch->{'Ид'}; 
            } 
            func_grupp($ch, $tmp_arr); 
        } 
    } 
}
так лучше? =)

  Ответить  
 
 автор: Владимир55   (06.01.2013 в 11:01)   письмо автору
103.4 Кб
 
   для: Sfinks   (06.01.2013 в 02:26)
 

Перемещение скобок по экрану, разумеется, само по себе ничего не меняет - коды по-прежнему выходят за пределы функции (на скриншоте помечены красным).

  Ответить  
 
 автор: cheops   (06.01.2013 в 11:07)   письмо автору
 
   для: Владимир55   (06.01.2013 в 11:01)
 

Редактор судя по всему не очень интеллектуально обрабатывает фигурные скобки.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования