За последние 24 часа нас посетили 21944 программиста и 1108 роботов. Сейчас ищут 477 программистов ...

Организовать данные JSON в виде дерева

Тема в разделе "Сделайте за меня", создана пользователем Ruskat, 14 янв 2021.

Метки:
  1. Ruskat

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

    С нами с:
    6 июн 2013
    Сообщения:
    28
    Симпатии:
    0
    Приветствую всех. Прошу помощи в организации древовидного JSON .
    Отсюда я получаю список каналов AceStream. Там список построен не сортированно.
    Для примера:
    Код (Text):
    1. [  
    2. {
    3. "infohash": "d3b4abd9951afb661a93e6add1206c3b68969dcb", "name": "\u0420\u0422\u0420-\u041f\u043b\u0430\u043d\u0435\u0442\u0430", "availability": 1, "availability_updated_at": 1610610542, "categories": [
    4. "entertaining"
    5. ]}, {
    6. "infohash": "355b7b202743167fb9099f60210f7010ae3d17f0", "name": "\u041f\u044f\u0442\u043d\u0438\u0446\u0430", "availability": 1, "availability_updated_at": 1610610542, "categories": [
    7. "entertaining", "movies", "music"
    8. ]}, {
    9. "infohash": "1eb03a5674f01828bfbe6a8967617eabd3973f23", "name": "\u041c\u0443\u0437-\u0422\u0412", "availability": 1, "availability_updated_at": 1610610542, "categories": [
    10. "music"
    11. ]}
    12.     ...
    13. ]
    Я загоняю данные в базу по соответствующим строкам.
    На выходе с базы я хочу получить данные в виде дерева с категориями и соответствующими им каналами.
    Например:
    Код (Text):
    1. [
    2.     "totalChannels": "-Всего каналов-",
    3.     "totalCats": "-Всего категорий-",
    4.     {
    5.     "id": "1",
    6.     "cat_name": "movies",
    7.     "in_cat": "-Колличество каналов в разделе-",
    8.     "lst": [{
    9.         "id": "15",
    10.         "name": "Vip Premium",
    11.         "categories": [
    12.             "movies"
    13.         ]},
    14.         {
    15.         "id": "27",
    16.         "name": "TV100 ation",
    17.         "categories": [
    18.             "movies"
    19.         ]},
    20.         {
    21.         "id": "85",
    22.         "name": "Кинохит",
    23.         "categories": [
    24.             "movies"
    25.         ]},
    26.         ]
    27.     },
    28.     {
    29.     "id": "2",
    30.     "cat_name": "educational",
    31.     "in_cat": "-Колличество каналов в разделе-",
    32.     "lst": [{
    33.         "id": "45",
    34.         "name": "Discovery Science HD",
    35.         "categories": [
    36.             "educational",
    37.             "movies"
    38.         ]},
    39.         {
    40.         "id": "124",
    41.         "name": "Discovery \u0420\u043e\u0441\u0441\u0438\u044f HD",
    42.         "categories": [
    43.             "educational",
    44.             "documentaries",
    45.             "movies"
    46.         ]},
    47.         {
    48.         "id": "511",
    49.         "name": "NASA TV",
    50.         "categories": [
    51.             "educational"
    52.         ]},
    53.         ]
    54.     }
    55.     ...
    56. ]
    Если канал подпадает под несколько категорий, то помещать его в первую, указанную в параметре "categories". Но не клонировать его на категории, к которым он подписал Если же канал не имеет привязки к категории - нет "categories", то подписать его к категории "без раздела".
    И это всё нужно выводить в JSON.
    Пока вывожу так:
    PHP:
    1. <?php
    2.     $result = $conn->query("SELECT * FROM channels ORDER BY `number` ASC");
    3.     $dbdata = array();
    4.         while ( $row = $result->fetch_assoc())  {
    5.             $dbdata[]=$row;
    6.         }
    7.     if(!headers_sent())
    8.     header('Content-Type: application/json; charset=utf-8', true,200);          
    9.         echo json_encode($dbdata,JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHES); //Читаем юникод.
    Заранее благодарен за помощь.
     
  2. Drunkenmunky

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

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    PHP:
    1. <?php
    2. $json = file_get_contents('https://api.,,,,,,,');
    3. $array = json_decode($json, true);
    4.  
    5. $new_array = array();
    6.  
    7. foreach($array as $key => $value)
    8. {
    9.    if(isset($array[$key]['categories']))
    10.      {
    11.       $new_array[$array[$key]['categories'][0]][] = $value;
    12.      }
    13.    else
    14.      {
    15.       $new_array['no categories'][] = $value;
    16.      }
    17. }
    18.  
    19. echo '<pre>';
    20. print_r ($new_array);
    21. ?>
     
  3. Ruskat

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

    С нами с:
    6 июн 2013
    Сообщения:
    28
    Симпатии:
    0
    Благодарствую, хорошо. Но мне нужно еще и идентифицировать (ID) отдельно каждый раздел и каждый канал.
    Я приводил пример:
    Код (Text):
    1. [
    2.     "totalChannels": "-Всего каналов-",
    3.     "totalCats": "-Всего категорий-",
    4.     {
    5.     "id": "1",
    6.     "cat_name": "movies",
    7.     "in_cat": "-Колличество каналов в разделе-",
    8.     "lst": [{
    9.         "id": "15",
    10.         "name": "Vip Premium",
    11.         "categories": [
    12.             "movies"
    13.         ]},
    14.         {
    15.         "id": "27",
    16.         "name": "TV100 ation",
    17.         "categories": [
    18.             "movies"
    19.         ]},
    20.         {
    21.         "id": "85",
    22.         "name": "Кинохит",
    23.         "categories": [
    24.             "movies"
    25.         ]},
    26.         ]
    27.     },
    28.     {
    29.     "id": "2",
    30.     "cat_name": "educational",
    31.     "in_cat": "-Колличество каналов в разделе-",
    32.     "lst": [{
    33.         "id": "45",
    34.         "name": "Discovery Science HD",
    35.         "categories": [
    36.             "educational",
    37.             "movies"
    38.         ]},
    39.         {
    40.         "id": "124",
    41.         "name": "Discovery \u0420\u043e\u0441\u0441\u0438\u044f HD",
    42.         "categories": [
    43.             "educational",
    44.             "documentaries",
    45.             "movies"
    46.         ]},
    47.         {
    48.         "id": "511",
    49.         "name": "NASA TV",
    50.         "categories": [
    51.             "educational"
    52.         ]},
    53.         ]
    54.     }
    55.     ...
    56. ]
     
  4. Drunkenmunky

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

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    PHP:
    1. ........
    2. //echo '<pre>';
    3. //print_r ($new_array);
    4.  
    5.  
    6. $totalChannels = count($array);
    7. $totalCats = count($new_array);
    8.  
    9. echo '"totalChannels": "'.$totalChannels.'"<br>';
    10. echo '"totalCats": "'.$totalCats.'"<br><br>';
    11.  
    12. foreach($new_array as $key => $value)
    13. {
    14. echo '<b>'.$key.':</b> <br>';
    15.   foreach($value as $v)
    16.   {
    17.   echo $v['name'].'<br>';
    18.   if (isset($v['categories'])) echo join('<br>', $v['categories']).'<br>------------<br>';
    19.   }
    20. }