while($row = mysqli_fetch_assoc($result)) {
echo (json_encode($row));
}
echo
产生:
{"name":"REPORTING","parent":"null","children":"BO"}{"name":"IHS","parent":"BO","children":"1"}{"name":"TOMCAT","parent":"BO","children":"1"}{"name":"WAS","parent":"BO","children":"1"}{"name":"BO","parent":"BO","children":"1"}{"name":"1","parent":"IHS","children":"APP NAME"}{"name":"1","parent":"TOMCAT","children":"APP NAME"}{"name":"1","parent":"WAS","children":"APP NAME"}{"name":"1","parent":"BO","children":"APP NAME"}
我正在寻找的是:
[
{
"name": "REPORTING",
"parent": "null",
"children": [
{
"name": "BO",
"parent": "REPORTING",
"children": [
{
"name": "I H S",
"parent": "BO",
"children": [
{
"name": "34534",
"parent": "BO",
"children": [
{
"name": "Application Name",
"parent": "34534",
}
]
},
{
"name": "34535",
"parent": "BO",
"children": [
{
"name": "Application Name",
"parent": "34535",
}
]
},
{
"name": "34536",
"parent": "BO",
"children": [
{
"name": "Application Name",
"parent": "34536",
}
]
最佳答案
您不能将行转储到 json_encode
echo 中,因为您的数据与所需结果中的 JSON 的结构不同。您必须编写基于父/子值构造树的代码。我建议您创建一个包含所需字段的类,并在循环中填充数据。
一个简单的示例(未完成的代码,只是为了提供对该方法的一些了解):
require_once ('MyClass.php')
$data = new MyClass();
while($row = mysqli_fetch_assoc($result)) {
if($row['parent'] == 'null') {
$data->parse($row);
} else {
$child = $data->findChild($row['parent']);
if($child !== false) {
$child->parseChild($row);
}
}
}
echo json_encode($data);
MyClass.php:
class MyClass {
public $name;
public $parent;
public $children;
public function __construct($name = "") {
$this->name = $name;
$this->parent = "null";
$this->children = array();
}
public function parse($rowdata) {
$this->name = $rowdata['name'];
$this->parent = $rowdata['parent'];
echo "Created object " . $this->name . "\n";
}
public function parseChild($rowdata) {
$child = new MyClass();
$child->parse($rowdata);
$this->children[] = $child;
}
public function findChild($name) {
if($this->name == $name) {
return $this;
} else {
foreach($this->children as $child) {
if($child->name == $name) {
return $child;
} else {
$ch = $child->findChild($name);
if($ch !== false) {
return $ch;
}
}
}
}
return false;
}
}
这段代码有缺陷和错误,比如 parent 需要在 child 之前。在您的示例中,echo
IHS 在 BO 之前出现,因此没有这样的父级,因此无法创建子级。您需要正确排序数据才能使此代码正常工作。
关于php - 将平面 json 转换为像 json 一样的 TreeView ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23514763/