За последние 24 часа нас посетили 22718 программистов и 1221 робот. Сейчас ищут 729 программистов ...

Прошу помочь с регулярным выражением

Тема в разделе "Сделайте за меня", создана пользователем radioactive, 12 июн 2019.

Метки:
  1. radioactive

    radioactive Новичок

    С нами с:
    24 сен 2016
    Сообщения:
    32
    Симпатии:
    1
    Имеется такого вида строка
    PHP:
    1. $string="2019.06.11\tparametr\tAnton\tbloks\t50 039\t5 200 м³\t362 604\r\n2019.06.05\tparametr\tAlexandr\tbloks\t33 606\t3 360 м³\t36 107";
    на самом деле в наличии много строк=), но тут только 2 разделителя "\t" и "\r\n"
    мне необходима функция которая преобразит его в json вида
    JSON Viewer или
    Код (Text):
    1. {"total":"2","items":[{"date":"2019.06.11","name1":"parametr","name2":"Anton","material":"bloks","count":50039,"value":5200,"price":362604},{"date":"2019.06.05","name1":"parametr","name2":"Alexandr","material":"bloks","count":33606,"value":3360,"price":36107}]}
    Как это лучше сделать? Прошу помочь решить мою проблему

    p.s пхп я пытаюсь понять а регулярки для меня это кошмар
     
  2. Artur_hopf

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

    С нами с:
    7 май 2018
    Сообщения:
    2.266
    Симпатии:
    405
    @radioactive вы лучше скажите откуда такая строка получается?
     
    radioactive нравится это.
  3. radioactive

    radioactive Новичок

    С нами с:
    24 сен 2016
    Сообщения:
    32
    Симпатии:
    1
    Сторонний сайт обрабатывает первоначальные данные и там есть возможность выгрузить такого вида строку
    Также он может выдать те-же данные без разделителей а просто пробелы или табуляции но в таком случае я так понимаю нельзя адекватно обработать цифры с пробелами
     
  4. Artur_hopf

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

    С нами с:
    7 май 2018
    Сообщения:
    2.266
    Симпатии:
    405
    переделал, на выходе ваш массив.
    PHP:
    1. <?php
    2. $string = "2019.06.11\tparametr\tAnton\tmaterial1\t50 039\t5 200 м³\t362 604\r\n2019.06.05\tparametr\tAlexandr\tmaterial1\t33 606\t3 360 м³\t36 107";
    3. $str = preg_replace("!([\b\t\n\r\f\"\\'])!", "\\\\\\1", $string);
    4. $temp = ['date', 'name1', 'name2', 'material', 'count', 'value' , 'price'];
    5. $array = explode("\\", $str);
    6. $count = count($temp);
    7. $i = 0;
    8. $s = 0;
    9. $result['total'] = 2;
    10. foreach($array as $key => $value){
    11.     $value = trim($value);
    12.     if(mb_strlen($value) === 0){
    13.         $i = 0;
    14.         $s++;
    15.     }else{
    16.         $result['items'][$s][$temp[$i]] =  $value;
    17.         $i++;
    18.     }
    19. }
    20.  
    21. print_r($result);
    22.  
    23. ?>
     
    #4 Artur_hopf, 12 июн 2019
    Последнее редактирование: 12 июн 2019
    radioactive нравится это.
  5. Artur_hopf

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

    С нами с:
    7 май 2018
    Сообщения:
    2.266
    Симпатии:
    405
    в конце добавьте только:
    PHP:
    1. $json = json_encode($result);
    2. print_r($json);
     
    radioactive нравится это.
  6. radioactive

    radioactive Новичок

    С нами с:
    24 сен 2016
    Сообщения:
    32
    Симпатии:
    1
    Потрясающая работа, все плюсы ваши!, сам я бы не смог такое придумать)
     
  7. keren

    keren Новичок

    С нами с:
    15 ноя 2017
    Сообщения:
    513
    Симпатии:
    42
    PHP:
    1. $string="2019.06.11\tparametr\tAnton\tbloks\t50 039\t5 200 м³\t362 604\r\n2019.06.05\tparametr\tAlexandr\tbloks\t33 606\t3 360 м³\t36 107";
    2. $s = explode("\r\n", $string); $res = [];
    3. $res['total'] = count($s);
    4. $res['items'] = array_map(function($e){
    5.    return array_combine(['date', 'name1', 'name2', 'material', 'count', 'value' , 'price'], explode("\t", $e));
    6. }, $s);
    7. echo json_encode($res);
     
    radioactive нравится это.
  8. radioactive

    radioactive Новичок

    С нами с:
    24 сен 2016
    Сообщения:
    32
    Симпатии:
    1
    почему то ваш вариант отказывается принимать get/post данные, выдает ошибку
    "Warning: array_combine(): Both parameters should have an equal number of elements in"
    и вывод
    PHP:
    1. echo json_encode($res);
    возвращает
    Код (Text):
    1. {"total":1,"items":[false]}
    но если передавать строкой то все работает хорошо

    судя из гугла проблема в кроется разности количества индексов массивов(или как-то так), подскажите почему при get/post возвращает false?