Преобразование вложенных данных из MySQL во вложенный массив - PullRequest
0 голосов
/ 08 января 2019

У меня есть таблица категории. Вот схема: -

|----------------------------------------------------------|
|  id  |   title_en   |         uid         |   parent_id  |
|----------------------------------------------------------|
|   1  |    Food      |   ehek330pdldie827  |      0       |
|----------------------------------------------------------|
|   2  |   Cuisines   |  8393kdo02o923awi20 |      0       |
|----------------------------------------------------------|
|   3  |  Fast Food   |  ri29jnwu29823urns0 |      1       |
|----------------------------------------------------------|
|   4  |   British    | eo301ks8292ke9202ms |      2       |
|----------------------------------------------------------|
|   5  |   Chinese    |  yh39kj201203msik7e |      2       |
|----------------------------------------------------------|
|   6  |   Outdoor    |  hsuw8920slsl7729kj |      0       |
|----------------------------------------------------------|

Корневые категории имеют parent_id 0, а дочерний - parent_id в качестве идентификатора родителя.

Я хочу получить данные из таблицы MySQL и преобразовать их в многомерный массив.

Вот мой код: -

public function create_array_tree($entity, $parent = 0, $visibility_for = null)
{
    $tree               = array(); 
    $children           = array();
    $currentLevelCount  = array(
                            'type'      => 'count',                                         // get the count
                            'table'     => $this->config->item($entity . '_table'),         // specify the table    
                            'select'    => 'id, uid, title_en, parent_id',                  // specify the field to fetch
                            'condition' => array(
                                                'parent_id' => $parent                      // condition: 'parent matches the id'
                                            )                                               // specify the condition
                        );  

    $currentLevelData   = array(
                            'type'      => 'all',                                           // get all the data
                            'table'     => $this->config->item($entity . '_table'),         // specify the table    
                            'select'    => 'id, uid, title_en, parent_id',                  // specify the field to fetch
                            'condition' => array(
                                                'parent_id' => $parent                      // condition: 'parent matches the id'
                                            )                                               // specify the condition
                        );  
    $countLevel         = $this->find($currentLevelCount);                  // get the count of the rows that match the conditions
    if($countLevel > 0)
    {

        $dataLevel    = $this->find($currentLevelData);
        foreach($dataLevel as $key => $dl)
        {
            if($visibility_for == Globals::COLLAPSIBLE_TREE)
            {
                $data['text']       = $dl['title_en'];
                $data['href']       = '#'.$dl['title_en'];
                $data['nodes']      = $this->create_array_tree($entity, $dl['id'], Globals::COLLAPSIBLE_TREE);
                $tree[]             = $data;
            }
            else
            {
                $data['id']         = $dl['id'];
                $data['title_en']   = $dl['title_en'];
                $data['uid']        = $dl['uid'];
                $data['parent_id']  = $dl['parent_id'];
                $data['children']   = $this->create_array_tree($entity, $dl['id']);
                $tree[]             = $data;
            }
        }
    }
    return $tree;
}

Это дает мне такой результат: -

{
  "status": 1,
  "tree": [
    {
      "text": "Food",
      "href": "#Food",
      "nodes": [
        {
          "text": "Fast Food",
          "href": "#Fast Food",
          "nodes": [

          ]
        }
      ]
    },
    {
      "text": "Cuisines",
      "href": "#Cuisines",
      "nodes": [
        {
          "text": "British",
          "href": "#British",
          "nodes": [

          ]
        },
        {
          "text": "Chinese",
          "href": "#Chinese",
          "nodes": [

          ]
        }
      ]
    },
    {
      "text": "Outdoor",
      "href": "#Outdoor",
      "nodes": []
    }
  ]
}

Теперь я хочу внести некоторые изменения в код. Категории, которые не имеют дочерних элементов, не должны иметь клавишу "nodes". Для этого я внес небольшое изменение в код: -

if($visibility_for == Globals::COLLAPSIBLE_TREE)
 {
        $data['text']       = $dl['title_en'];
        $data['href']       = '#'.$dl['title_en'];
        $children           = $this->create_array_tree($entity, $dl['id'], Globals::COLLAPSIBLE_TREE);
        if(isset($children) && !empty($children))
        {
            $data['nodes']  = $children;
        }
        $tree[]             = $data;
 }

Это дает мне эти данные, которые неверны: -

{
  "status": 1,
  "tree": [
    {
      "text": "Food",
      "href": "#Food",
      "nodes": [
        {
          "text": "Fast Food",
          "href": "#Fast Food",
          "nodes": [

          ]
        }
      ]
    },
    {
      "text": "Cuisines",
      "href": "#Cuisines",
      "nodes": [
        {
          "text": "British",
          "href": "#British",
          "nodes": [

          ]
        },
        {
          "text": "Chinese",
          "href": "#Chinese",
          "nodes": [

          ]
        }
      ]
    },
    {
      "text": "Outdoor",
      "href": "#Outdoor",
      "nodes": [
        {
          "text": "British",
          "href": "#British",
          "nodes": [

          ]
        },
        {
          "text": "Chinese",
          "href": "#Chinese",
          "nodes": [

          ]
        }
      ]
    }
  ]
}

Узел "Outdoor" содержит узлов"Cuisines".

Но если я напишу такой код: -

if($visibility_for == Globals::COLLAPSIBLE_TREE)
{
    $data['text']       = $dl['title_en'];
    $data['href']       = '#'.$dl['title_en'];
    $children           = $this->create_array_tree($entity, $dl['id'], Globals::COLLAPSIBLE_TREE);
    if(isset($children) && !empty($children))
    {
        $data['nodes']  = $children;
    }
    else
    {
        $data['nodes']  = '';
    }
    $tree[]             = $data;
}

Данные поступают так: -

{
  "status": 1,
  "tree": [
    {
      "text": "Food",
      "href": "#Food",
      "nodes": [
        {
          "text": "Fast Food",
          "href": "#Fast Food",
          "nodes": [

          ]
        }
      ]
    },
    {
      "text": "Cuisines",
      "href": "#Cuisines",
      "nodes": [
        {
          "text": "British",
          "href": "#British",
          "nodes": [

          ]
        },
        {
          "text": "Chinese",
          "href": "#Chinese",
          "nodes": [

          ]
        }
      ]
    },
    {
      "text": "Outdoor",
      "href": "#Outdoor",
      "nodes": ""
    }
  ]
}

Не удалось удалить тег node из категорий, у которых нет дочерних элементов. Как я могу это исправить?

...