У меня есть таблица категории. Вот схема: -
|----------------------------------------------------------|
| 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 из категорий, у которых нет дочерних элементов. Как я могу это исправить?