За последние 24 часа нас посетили 20049 программистов и 1001 робот. Сейчас ищут 312 программистов ...

Переменная в foreach обнуляется

Тема в разделе "PHP для новичков", создана пользователем Кирилл_QBX, 4 мар 2020.

Метки:
  1. Кирилл_QBX

    Кирилл_QBX Новичок

    С нами с:
    4 мар 2020
    Сообщения:
    3
    Симпатии:
    0
    Уважаемые программеры!
    Нужна помощь!

    Пишу парсер xml данных ЕГРЮЛ. Сам новичок, пишу так: есть вопрос ищу код в интернете, разбираю его и адаптирую под себя.
    Дык вот... для парсинга нашел, вроде бы, хороший инструмент xml_parser. Все бы ничего, но!

    Задача такая: парсю документ через foreach, соответственно нахожу елемент, в нем необходимый атрибут, вытаскиваю из него значение, вношу его в mysql. Процедура следующая: если нашел атрибут ОГРН, то далее ищу атрибуты ИНН, НаимЮЛСокр. Возникает следующая проблема: так как ОГРН и ИНН содержаться в одном элементе то все хорошо (создается строка в таблице в нее вносится ОГРН а далее обновляется ИНН, разумеется в таблице через поиск строки со значением равным Num присвоенным созданной строке, выполняю через переменную $nump), но вот НаимЮЛСокр находится в другом элементе, а соответственно я так понимаю что $nump обнуляется, и тут я теряю возможность идентифицировать строку в таблице.

    Вопрос 1.
    Как сохранить значение $nump для поиска в других элементах? Или другими словами, как использовать значения атрибутов одних элементов в других?

    Вопрос 2. Возможно кто то подскажет другие коды парсинга xml на русском?

    Код (Text):
    1. foreach ($attrs as $attr => $value) {
    2. if ($name=="СвЮЛ" and $attr=="ОГРН") {
    3.      echo "ОГРН ".$value.'<br>';
    4.      $lins="SELECT * FROM test ORDER BY Num DESC LIMIT 1";
    5.      $result=mysqli_query($connect,$lins);
    6.      $num=  mysqli_num_fields($result);
    7.      $row = mysqli_fetch_array($result);
    8.      $nump=$row['Num']+1;
    9.      echo "num ".$nump."<br>";
    10.      $newrow="INSERT INTO test (Num, GRN) VALUES ('".$nump."', '".$value."')";
    11.      $result=mysqli_query($connect,$newrow);
    12. }
    13.   if ($name=="СвЮЛ" and $attr=="ИНН") {
    14.      echo "ИНН ".$value."<br>";
    15.      $newrow="UPDATE test SET INN='".$value."' WHERE test.Num='".$nump."'";
    16.      $result=mysqli_query($connect,$newrow);
    17. }
    18.   if ($name=="СвНаимЮЛ" and $attr=="НаимЮЛСокр") {
    19.      echo "Наименование ".$value."<br>";
    20.      $newrow="UPDATE test SET Nameorg='".$value."' WHERE test.INN='".$inn."'";
    21.      $result=mysqli_query($connect,$newrow);
    22.   }
    23. }
    Отрезок xml
    Код (Text):
    1. <?xml version="1.0" encoding="windows-1251"?>
    2. <Файл ИдФайл="VO_RUGFO_0000_0100_20170405_73fb69f3-98c3-469d-9134-7cb844107ffb" ВерсФорм="4.05" ТипИнф="ЕГРЮЛ_ОТКР_СВЕД" ВерсПрог="1.0.0.2" КолДок="23">
    3. <ИдОтпр ДолжОтв="Главный госналогинспектор аналитического отде" Тлф="(8772)56-80-29"><ФИООтв Фамилия="Алиева" Имя="Эльвира" Отчество="Эхиаровна" />
    4. </ИдОтпр>
    5. <Документ ИдДок="f2fdc916-8fb4-4053-829b-141219907f9c">
    6. <СвЮЛ ДатаВып="2017-04-04" ОГРН="1120107002014" ДатаОГРН="2012-12-25" ИНН="0107023459" КПП="010701001" СпрОПФ="ОКОПФ" КодОПФ="12300" ПолнНаимОПФ="Общества с ограниченной ответственностью">
    7.   <СвНаимЮЛ НаимЮЛПолн="ОБЩЕСТВО С ОГРАНИЧЕННОЙ ОТВЕТСТВЕННОСТЬЮ &quot;ПРЕСТИЖ&quot;" НаимЮЛСокр="ООО &quot;ПРЕСТИЖ&quot;">
    8.     <ГРНДата ГРН="1120107002014" ДатаЗаписи="2012-12-25" />
    9.   </СвНаимЮЛ>
    10.   <СвАдресЮЛ>
    11.     <АдресРФ Индекс="385140" КодРегион="01" КодАдрКладр="010050000270094" Дом="39А" Кварт="210">
    12.       <Регион ТипРегион="РЕСПУБЛИКА" НаимРегион="АДЫГЕЯ" />
    13.       <Район ТипРайон="РАЙОН" НаимРайон="ТАХТАМУКАЙСКИЙ" />
    14.       <НаселПункт ТипНаселПункт="ПОСЕЛОК ГОРОДСКОГО ТИПА" НаимНаселПункт="ЯБЛОНОВСКИЙ" />
    15.       <Улица ТипУлица="УЛИЦА" НаимУлица="ЛЕНИНА" />
    16.       <ГРНДата ГРН="1120107002014" ДатаЗаписи="2012-12-25" />
    17.     </АдресРФ>
    18.   </СвАдресЮЛ>
     
    #1 Кирилл_QBX, 4 мар 2020
    Последнее редактирование: 4 мар 2020
  2. Кирилл_QBX

    Кирилл_QBX Новичок

    С нами с:
    4 мар 2020
    Сообщения:
    3
    Симпатии:
    0
    Проблему я понял. foreach это не for а массив и соответственно если я вытаскиваю данные из одного элемента его переменные никак не относятся к другому. И если я просто вытаскиваю переменные атрибутов, то это лишь набор строк. Потому перефразирую свой вопрос:
    В xml данные по многим организациям идут в определенной последовательности:
    элемент: ИНН, ОРГН
    элемент: Наименование
    элемент: Адрес
    элемент: Директор

    далее такой же блок по другой компании и так далее...
    Как мне спарсить данные так чтобы определять какое Наименование к какому ИНН принадлежит и какой адрес к какому ИНН и так далее?
     
  3. Кирилл_QBX

    Кирилл_QBX Новичок

    С нами с:
    4 мар 2020
    Сообщения:
    3
    Симпатии:
    0
    Спасибо всем что подсказали. разобрался самостоятельно. Кому будет интересно пишите, помогу
     
  4. Valick

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

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    @Кирилл_QBX, чувак, не надо ёрничать. Нихрена не понятно, что ты там к чему пристыковаваешь. Что там должно сохранится и тд. Задавать вопрос надо грамотно. XML файл и структуру БД прилагать к вопросу.
    Ну и в целом, правилами форума запрещены обсуждения парсеров, хотя распарсить xml это немного другая история.