За последние 24 часа нас посетили 37989 программистов и 8304 робота. Сейчас ищут 1904 программиста ...

Return в рекурсивной функции

Тема в разделе "PHP для новичков", создана пользователем Sarmetr, 8 ноя 2023.

  1. Sarmetr

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

    С нами с:
    2 июн 2019
    Сообщения:
    27
    Симпатии:
    0
    Добрый день всем.
    Подскажите почему не отрабатывает return в мой функции ??
    Он всегда присылает NULL. Сама функция работает так как надо , но НЕ возвращает результат.
    Мне в принципе без разницы какой результат , можно например цифру 1 вернуть, т.е. что бы знать что нашлось то что искалось.

    PHP:
    1. public static function getXmlDecompose($xml_data)
    2.         {
    3.             $session = Yii::$app->session;
    4.      
    5.             $cid = $session->get('position') ? $session->get('position')[0] : null; // id компании
    6.      
    7.             $companyInn = Company::getCompanyINN($cid);
    8.          
    9.             foreach ($xml_data as $property) {
    10.                 if ($property == $companyInn) {
    11.                     return self::getXmlDecompose($xml_data); // здесь нужно что то вернуть, например 1, но всегда NULL
    12.                 }else{
    13.                     $xml_data = $property;
    14.                     self:: getXmlDecompose($xml_data);
    15.                 }
    16.             }
    17.         }
    Уточняю, $xml_data это массив в котором ищется ИНН компании путем перебирания.
     
  2. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.874
    Симпатии:
    753
    Адрес:
    Татарстан
    бред какой-то
    если перебор - не надо никакой рекурсии
    а вообще для работы с XML давно и успешно используют всякие XPath и другие инструменты

    Если прям уперлись в свое решение - для начала поясните - какую структуру имеет $xml_data, какой атрибут ищете, или свойств итд

    ну так и верните
    PHP:
    1. return 1; // здесь нужно
     
  3. Sarmetr

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

    С нами с:
    2 июн 2019
    Сообщения:
    27
    Симпатии:
    0
    В $xml_data многоуровневый объект созданный таким способом
    $xml = file_get_contents($url);
    $xml_data = simplexml_load_string($xml); // XML объект

    Так как объект может содержать неизвестное количество вложенностей поэтому и использую рекурсивную функцию.
    --- Добавлено ---
    Функция работает как надо и ищет то что нужно в независимости от размера и уровня вложенностей объекта.
    Вопрос в том как вернуть значение назад если что нашла ? return в упор ничего не возвращает кроме null
    --- Добавлено ---
    <Data>
    <Company>
    <UUID>1234567890d</UUID>
    <INN>1234567890</INN>
    <KPP>773860001</KPP>
    <Description_RUS>ПCR</Description_RUS>
    <Description_ENG>ENetherlands</Description_ENG>
    <Country_RUS>Россия</Country_RUS>
    <SchedulesList>
    <ScheduleInfo>
    <ScheduleID>696fdc37-6d1e-11eb-80c4-4cedfb6c4a8f</ScheduleID>
    <ScheduleName>5 дней в неделю по 8ч</ScheduleName>
    <YearInfo>
    <Year>2022</Year>
    <MonthInfo>
    <Month>1</Month>
    <Date>2022-01-10</Date>
    <Hours>8</Hours>
    <DayWeek>1</DayWeek>
    <Date>2022-01-11</Date>
    <Hours>8</Hours>
    <DayWeek>2</DayWeek>
    <Date>2022-01-12</Date>
    <Hours>8</Hours>
    <DayWeek>3</DayWeek>
    <Date>2022-01-13</Date>
    <Hours>8</Hours>
    <DayWeek>4</DayWeek>
    <Date>2022-01-14</Date>
    <Hours>8</Hours>
    <DayWeek>5</DayWeek>
    <Date>2022-01-17</Date>
    <Hours>8</Hours>
    <DayWeek>1</DayWeek>

    Вот часть , нужно найти INN ( набор цифр ) который может быть в ЛЮБОМ месте и называться как угодно (не обязательно INN).
    --- Добавлено ---
    Код (Text):
    1. <Data>
    2. <Company>
    3. <UUID>1234567890d</UUID>
    4. <INN>1234567890</INN>
    5. <KPP>773860001</KPP>
    6. <Description_RUS>ПCR</Description_RUS>
    7. <Description_ENG>ENetherlands</Description_ENG>
    8. <Country_RUS>Россия</Country_RUS>
    9. <SchedulesList>
    10. <ScheduleInfo>
    11. <ScheduleID>696fdc37-6d1e-11eb-80c4-4cedfb6c4a8f</ScheduleID>
    12. <ScheduleName>5 дней в неделю по 8ч</ScheduleName>
    13. <YearInfo>
    14. <Year>2022</Year>
    15. <MonthInfo>
    16. <Month>1</Month>
    17. <Date>2022-01-10</Date>
    18. <Hours>8</Hours>
    19. <DayWeek>1</DayWeek>
    20. <Date>2022-01-11</Date>
    21. <Hours>8</Hours>
    22. <DayWeek>2</DayWeek>
    23. <Date>2022-01-12</Date>
    24. <Hours>8</Hours>
    25. <DayWeek>3</DayWeek>
    26. <Date>2022-01-13</Date>
    27. <Hours>8</Hours>
    28. <DayWeek>4</DayWeek>
    29. <Date>2022-01-14</Date>
    30. <Hours>8</Hours>
    31. <DayWeek>5</DayWeek>
    32. <Date>2022-01-17</Date>
    33. <Hours>8</Hours>
    34. <DayWeek>1</DayWeek>
    --- Добавлено ---
    Здесь не отабаражаются уровни вложенности, но на самом деле только в представленном мной куске их 5
    --- Добавлено ---

    Это первое что я попробовал. Не возвращает 1 , возвращает NULL. При этом если написать return var_damp(1) то выводит на экран 1, но эту единичку не видно никак в контроллере откуда я вызываю эту функцию и где я жду от нее ответа в виде 1.
    --- Добавлено ---
    PHP:
    1.  public static function getXmlDecompose($xml_data)
    2.         {
    3.             $session = Yii::$app->session;
    4.      
    5.             $cid = $session->get('position') ? $session->get('position')[0] : null; // id компании
    6.      
    7.             $companyInn = Company::getCompanyINN($cid);
    8.          
    9.             foreach ($xml_data as $property) {
    10.                 if ($property != $companyInn) {
    11.                     self:: getXmlDecompose($property);
    12.                 }elseif($property == $companyInn){
    13.                     return 1; // должна прилететь единица, но прилетfет NULL
    14.                 }else{
    15.                     return null;
    16.                 }
    17.             }
    18.          
    19.         }
    --- Добавлено ---
    При чем абсалютно без разницы что я нипишу в return всё равно функция возвратит через этот return NULL и только если вывезти на экран через var_damp будет видно что вернула return. Вот такая вот загадка. Пробовал и массивы и объекты и просто текст , ничего не возварщается, только NULL и все тут.
    --- Добавлено ---
    PHP:
    1. $xml = CycleFile::getXmlDecompose($xml_data);
    Вот так в контроллере в $xml должна быть либо 1 либо null, но там всегда null даже когда туда возвращается 1
    --- Добавлено ---
    При чем если со стороны контроллера написать
    return var_dump($xml); то все равно NULL выведит на экран, а если в самой функции написать return var_damp(1) то тогда выведет на экран (int)1. Я х.з всю голову уже сломал что не так .
     
  4. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.874
    Симпатии:
    753
    Адрес:
    Татарстан
    если все-же у компании искать, то
    PHP:
    1. $res = $xml_data->xpath("//Company[INN='1234567890']");
    для любой сущность, в любом поле -
    PHP:
    1. $res = $xml_data->xpath("//*[*='1234567890']");
     
  5. Sarmetr

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

    С нами с:
    2 июн 2019
    Сообщения:
    27
    Симпатии:
    0
    Спасибо. Сейчас попробую.
    --- Добавлено ---
    Отлично. Если находит выдает массив (вложенный), где нашел. Не знал о такой функции, поэтому сам писал, мутил
    СПАСИБО добрый человек.
    У меня вопрос, а у Exel такое есть ???
    Ну для PDF я нашел smalot/pdfparser пока не изучал его.
     
  6. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.874
    Симпатии:
    753
    Адрес:
    Татарстан
    новые вопросы не по теме - задавайте в новых темах
     
  7. Sarmetr

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

    С нами с:
    2 июн 2019
    Сообщения:
    27
    Симпатии:
    0
    Добрый день.

    Можете подсказать
    Почему
    1. $res = $xml_data->xpath("//*[*='1234567890']"); ИНН ищет (набор цифр) а любое слово например Тест $res = $xml_data->xpath("//*[*='Тест']"); не ищет, хотя оно есть в документе ??
    --- Добавлено ---
    Хотя я делаю все строго по документации https://www.php.net/manual/ru/simplexmlelement.xpath.php
    --- Добавлено ---
    Вопрос закрыт, нашел ошибку.
     
  8. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.874
    Симпатии:
    753
    Адрес:
    Татарстан
    нашел ответ на свой вопрос - опубликуй его здесь... чтоб народ видел и не делал таких ошибок