За последние 24 часа нас посетили 37259 программистов и 7910 роботов. Сейчас ищут 1782 программиста ...

Разобрать элементы массива на подмассивы.

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

  1. picachu

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

    С нами с:
    1 мар 2016
    Сообщения:
    5
    Симпатии:
    0
    Добрый день, уважаемые форумчане
    Помогите пожалуйста
    Программа пишет лог в файл в следующем формате.:
    Код (Text):
    1. {"T":"2023-03-02T20:50:39.914421885+03:00","QH":"clck.yandex.net","QT":"A","QC":"IN","CP":"","Answer":"pAAQABwA","Result":{"Rules":[{"Text":"||clck.yandex.net^$important"}],"Reason":3,"IsFiltered":true},"IP":"192.168.10.192","Elapsed":2413266}
    2. {"T":"2023-03-02T20:52:19.388678105+03:00","QH":"otn1.samsungcloudcdn.com","QT":"A","QC":"IN","CP":"","Answer":"tc3VuZ2Nsb","Result":{},"Upstream":"tls://dns.google:853","IP":"192.168.10.130","Elapsed":4977937,"Cached":true}
    3. {"T":"2023-03-02T20:52:22.648013244+03:00","QH":"appboot.netflix.com","QT":"A","QC":"IN","CP":"","Answer":"OlCBgb2","Result":{"Rules":[{"Text":"||netflix.com^$important"}],"Reason":3,"IsFiltered":true},"IP":"192.168.10.130","Elapsed":8480623}
    Понадобилось разложить лог на массив, что бы вытаскивать некоторые данные.
    PHP:
    1. $data = '/opt/AdGuardHome/data/querylog.json';  // лог
    2. $cont_data = (file($data));
    3. if (!is_array($cont_data)) die(" Error! Is not array \n");
    Считав файл получил одномерный массив в котором строки стали значениями. Но естественно это не приблизило к тому что требовалось.
    PHP:
    1.  
    2. (
    3.     [0] => {"T":"2023-03-02T20:50:39.914421885+03:00","QH":"clck.yandex.net","QT":"A","QC":"IN","CP":"","Answer":"pAAQABwA","Result":{"Rules":[{"Text":"||clck.yandex.net^$important"}],"Reason":3,"IsFiltered":true},"IP":"192.168.10.192","Elapsed":2413266}
    4.     [1] => {"T":"2023-03-02T20:52:19.388678105+03:00","QH":"otn1.samsungcloudcdn.com","QT":"A","QC":"IN","CP":"","Answer":"tc3VuZ2Nsb","Result":{},"Upstream":"tls://dns.google:853","IP":"192.168.10.130","Elapsed":4977937,"Cached":true}
    5.     [2] => {"T":"2023-03-02T20:52:22.648013244+03:00","QH":"appboot.netflix.com","QT":"A","QC":"IN","CP":"","Answer":"OlCBgb2","Result":{"Rules":[{"Text":"||netflix.com^$important"}],"Reason":3,"IsFiltered":true},"IP":"192.168.10.130","Elapsed":8480623}
    6. )
    Почитав интернет, понял, что необходимо пройти по значениям в цикле и перевести их в массив. Нашел, что это можно сделать командой preg_split, для чего попробовал следующий цикл:
    PHP:
    1. $data = '/opt/AdGuardHome/data/querylog.json'; // лог
    2. [LIST=1]
    3. [*]$cont_data = (file($data));
    4. [*]if (!is_array($cont_data)) die(" Error! Is not array \n");
    5. [/LIST]
    6.   foreach ($cont_data as $key => $val) {
    7.         $cont_array = preg_split('/[,]/u', $val, -1,    PREG_SPLIT_NO_EMPTY);
    8.     }
    В результате получил много мелких отдельных массивов, при этом в значения записался "мусор" который не нужен. Например скобки {. То есть опять не то.
    PHP:
    1.     [0] => {"T":"2023-03-02T20:50:39.914421885+03:00"
    2.     [1] => "QH":"clck.yandex.net"
    3.     [2] => "QT":"A"
    4.     [3] => "QC":"IN"
    5.     [4] => "CP":""
    6.     [5] => "Answer":"pAAQABwA"
    7.     [6] => "Result":{"Rules":[{"Text":"||clck.yandex.net^$important"}]
    8.     [7] => "Reason":3
    9.     [8] => "IsFiltered":true}
    10.     [9] => "IP":"192.168.10.192"
    11.     [10] => "Elapsed":2413266} )
    12.     [0] => {"T":"2023-03-02T20:52:19.388678105+03:00"
    13.     [1] => "QH":"otn1.samsungcloudcdn.com"
    14.     [2] => "QT":"A"
    15.     [3] => "QC":"IN"
    16.     [4] => "CP":""
    17.     [5] => "Answer":"tc3VuZ2Nsb"
    18.     [6] => "Result":{}
    19.     [7] => "Upstream":"tls://dns.google:853"
    20.     [8] => "IP":"192.168.10.130"
    21.     [9] => "Elapsed":4977937
    22.     [10] => "Cached":true} )
    23.     [0] => {"T":"2023-03-02T20:52:22.648013244+03:00"
    24.     [1] => "QH":"appboot.netflix.com"
    25.     [2] => "QT":"A"
    26.     [3] => "QC":"IN"
    27.     [4] => "CP":""
    28.     [5] => "Answer":"OlCBgb2"
    29.     [6] => "Result":{"Rules":[{"Text":"||netflix.com^$important"}]
    30.     [7] => "Reason":3
    31.     [8] => "IsFiltered":true}
    32.     [9] => "IP":"192.68.10.130"
    33.     [10] => "Elapsed":8480623} )
    И всё, дальше я уткнулся и не понимаю, как из исходных строк сделать нормальный многомерный массив. Пробовал разные примеры из интернета, но к сожалению, большинство сайтов просто перепечатывает или справку или код друг у друга
    В результате инете ответа на свой вопрос не нашел, ну или не правильно формулировал запросы.
    Подскажите, хотя бы примерное направление куда смотреть, что бы получить из исходных данных вот такой многомерный массив (массив нарисован руками)
    PHP:
    1.     [0] => Array
    2.         (
    3.             [T] => 2023-03-02T20:50:39.914421885+03:00
    4.             [QH] => clck.yandex.net
    5.             [QT] => A
    6.             [QC] => IN
    7.             [CP] =>
    8.             [Answer] => pAAQABwA
    9.             [Result] => Array
    10.                 (
    11.                     [Rules] => Array
    12.                         (
    13.                             [Text] => ||clck.yandex.net^
    14.                             [Reason] => 3
    15.                             [IsFiltered] => true
    16.                         )
    17.                 )
    18.             [IP] => 192.168.10.192
    19.             [Elapsed] => 2413266
    20.         )
    21.     [1] => Array
    22.         (
    23.             [T] => 2023-03-02T20:52:19.388678105+03:00
    24.             [QH] => otn1.samsungcloudcdn.com
    25.             [QT] => A
    26.             [QC] => IN
    27.             [CP] =>
    28.             [Answer] => tc3VuZ2Nsb
    29.             [Result] => Array
    30.                 (
    31.                     [Rules] => Array
    32.                         (
    33.                         )
    34.                 )
    35.             [IP] => 192.168.10.130
    36.             [Elapsed] => 4977937
    37.             [Cached] => true
    38.         )
    39.     [2] => Array
    40.         (
    41.             [T] => 2023-03-02T20:52:22.648013244+03:00
    42.             [QH] => appboot.netflix.com
    43.             [QT] => A
    44.             [QC] => IN
    45.             [CP] =>
    46.             [Answer] => pAAQABwA
    47.             [Result] => Array
    48.                 (
    49.                     [Rules] => Array
    50.                         (
    51.                             [Text] => ||netflix.com^
    52.                             [Reason] => 3
    53.                             [IsFiltered] => true
    54.                         )
    55.                 )
    56.             [IP] => 192.168.10.130
    57.             [Elapsed] => 8480623
    58.         )
    59. )
     
  2. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.840
    Симпатии:
    1.338
    Адрес:
    Лень
    PHP:
    1. foreach ( new SplFileObject( 'numbers.txt', 'r' ) AS $id => $line )
    2. {
    3.    trim + json_decode - гугли эти функции
    4. }
     
  3. rr33rr

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

    С нами с:
    6 май 2021
    Сообщения:
    35
    Симпатии:
    18
    PHP:
    1. <?php
    2. // $data = '/opt/AdGuardHome/data/querylog.json'; // лог
    3. // $input = file($data);
    4. $input = [
    5.   0 => '{"T":"2023-03-02T20:50:39.914421885+03:00","QH":"clck.yandex.net","QT":"A","QC":"IN","CP":"","Answer":"pAAQABwA","Result":{"Rules":[{"Text":"||clck.yandex.net^$important"}],"Reason":3,"IsFiltered":true},"IP":"192.168.10.192","Elapsed":2413266}',
    6.   1 => '{"T":"2023-03-02T20:52:19.388678105+03:00","QH":"otn1.samsungcloudcdn.com","QT":"A","QC":"IN","CP":"","Answer":"tc3VuZ2Nsb","Result":{},"Upstream":"tls://dns.google:853","IP":"192.168.10.130","Elapsed":4977937,"Cached":true}',
    7.   2 => '{"T":"2023-03-02T20:52:22.648013244+03:00","QH":"appboot.netflix.com","QT":"A","QC":"IN","CP":"","Answer":"OlCBgb2","Result":{"Rules":[{"Text":"||netflix.com^$important"}],"Reason":3,"IsFiltered":true},"IP":"192.168.10.130","Elapsed":8480623}',
    8. ];
    9. $output = [];
    10. foreach($input as $json) {
    11.   $output[] = json_decode($json, true);
    12. }
    13.  
    14. echo $output[2]['Answer'];
    15. //OlCBgb2
    16. echo $output[2]['IP'];
    17. //192.168.10.130
    18.  
    19. print_r($output);
    20. ?>
    Код (Text):
    1. Array
    2. (
    3.     [0] => Array
    4.         (
    5.             [T] => 2023-03-02T20:50:39.914421885+03:00
    6.             [QH] => clck.yandex.net
    7.             [QT] => A
    8.             [QC] => IN
    9.             [CP] =>
    10.             [Answer] => pAAQABwA
    11.             [Result] => Array
    12.                 (
    13.                     [Rules] => Array
    14.                         (
    15.                             [0] => Array
    16.                                 (
    17.                                     [Text] => ||clck.yandex.net^$important
    18.                                 )
    19.  
    20.                         )
    21.  
    22.                     [Reason] => 3
    23.                     [IsFiltered] => 1
    24.                 )
    25.  
    26.             [IP] => 192.168.10.192
    27.             [Elapsed] => 2413266
    28.         )
    29.  
    30.     [1] => Array
    31.         (
    32.             [T] => 2023-03-02T20:52:19.388678105+03:00
    33.             [QH] => otn1.samsungcloudcdn.com
    34.             [QT] => A
    35.             [QC] => IN
    36.             [CP] =>
    37.             [Answer] => tc3VuZ2Nsb
    38.             [Result] => Array
    39.                 (
    40.                 )
    41.  
    42.             [Upstream] => tls://dns.google:853
    43.             [IP] => 192.168.10.130
    44.             [Elapsed] => 4977937
    45.             [Cached] => 1
    46.         )
    47.  
    48.     [2] => Array
    49.         (
    50.             [T] => 2023-03-02T20:52:22.648013244+03:00
    51.             [QH] => appboot.netflix.com
    52.             [QT] => A
    53.             [QC] => IN
    54.             [CP] =>
    55.             [Answer] => OlCBgb2
    56.             [Result] => Array
    57.                 (
    58.                     [Rules] => Array
    59.                         (
    60.                             [0] => Array
    61.                                 (
    62.                                     [Text] => ||netflix.com^$important
    63.                                 )
    64.  
    65.                         )
    66.  
    67.                     [Reason] => 3
    68.                     [IsFiltered] => 1
    69.                 )
    70.  
    71.             [IP] => 192.168.10.130
    72.             [Elapsed] => 8480623
    73.         )
    74.  
    75. )
     
    picachu и antoniii нравится это.
  4. picachu

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

    С нами с:
    1 мар 2016
    Сообщения:
    5
    Симпатии:
    0
    @rr33rr, я идиот :(

    Ведь самое первое , что я попробовал это разобрать массив как json. Только я пробовал разобрать строки, а надо было просто превратить строки в массив. Спасибо.