Статьи / PHP


php Adjacency List to json (вывод списка смежности из mysql в json в виде дерева)


//по умолчанию корневым элементом считается родитель со значением $pid = 0
function _z00_get_tree($tree, $pid=0) {

$a = array();

foreach ($tree as $row) {
if ($row['pid'] == $pid) {

$child = _z00_get_tree($tree, $row['id']);

$a[] = array( 'name' => $row['name'], 'child' => $child );
}
}

if(count($a) == 0) {
return null;
}

return $a;
}


$tree = array(
array('name' => 'Уровень 1', 'id' => 1, 'pid' => 0),
array('name' => 'Уровень 1.1', 'id' => 2, 'pid' => 1),
array('name' => 'Уровень 1.2', 'id' => 3, 'pid' => 1),
array('name' => 'Уровень 1.3', 'id' => 4, 'pid' => 1),
array('name' => 'Уровень 2', 'id' => 5, 'pid' => 0),
array('name' => 'Уровень 2.1', 'id' => 6, 'pid' => 5),
array('name' => 'Уровень 2.2', 'id' => 7, 'pid' => 5),
array('name' => 'Уровень 3', 'id' => 8, 'pid' => 0),
array('name' => 'Уровень 3.1', 'id' => 9, 'pid' => 8),
array('name' => 'Уровень 3.1.1', 'id' => 10, 'pid' => 9),
array('name' => 'Уровень 3.1.2', 'id' => 11, 'pid' => 9),
);

header("Content-type: text/html; charset=utf-8");

echo '<script> var json = '.json_encode(_z00_get_tree($tree)).'</script>';


В итоге получим вот такое дерево json
[
{"name":"Уровень 1","child":[
[
{"name":"Уровень 1.1","child":null},
{"name":"Уровень 1.2","child":null},
{"name":"Уровень 1.3","child":null}
]
]},
{"name":"Уровень 2","child":[
[
{"name":"Уровень 2.1","child":null},
{"name":"Уровень 2.2","child":null}
]
]},
{"name":"Уровень 3","child":[
[
{"name":"Уровень 3.1","child":[
[
{"name":"Уровень 3.1.1","child":null},
{"name":"Уровень 3.1.2","child":null}
]
]
}
]]}
]