有一个我的树阵列,看起来像这样:
$testArray = array(
array(
'id' => 12,
'address' => 'root addr',
'parent_id' => 0,
'children' => array(
array(
'id' => 11,
'address' => 'child addr',
'parent_id' => 12,
'children' => array(
array(
'id' => 16,
'address' => 'child addr 2',
'parent_id' => 11,
'children' => array(
array(
'id' => 19,
'address' => 'child addr 3',
'parent_id' => 16,
),
),
),
array(
'id' => 18,
'address' => 'child addr 4',
'parent_id' => 11,
),
array(
'id' => 20,
'address' => 'child addr 5',
'parent_id' => 11,
),
),
),
),
),
array(
'id' => 17,
'address' => 'root addr 2',
'parent_id' => 0,
),
);
我有一个函数来构建一个级别的数组:
$result = array('aaData' => array());
function printTree($data, $level = 0, $p_counter = 1) {
foreach ($data as $item) {
if ($item['parent_id'] == 0) {
$addr = $p_counter . '. ' . $item['address'];
$p_counter++;
}
else if ($item['parent_id'] != 0) {
$addr = strLevel(' - ', $level) . $item['address'];
} else {
$addr = $item['address'];
}
global $result;
$result['aaData'][] = Array(
$addr,
);
if (isset($item['children'])) {
printTree($item['children'], $level + 1, $p_counter);
}
}
return $result;
}
另一个尝试绘制编号的功能,但它不是我想要的:
function strLevel($str, $level) {
$level++;
$result = '';
for ($i = 1; $i < $level; $i++) {
if ($i == 1) {
$result .= $i . ' - ' . $i;
} else {
$result .= $str.$i;
}
}
$result .= '.';
return $result;
}
我的输出是这样的:
1. root addr
1 - 1.child addr
1 - 1 - 2.child addr 2
1 - 1 - 2 - 3.child addr 3
1 - 1 - 2.child addr 4
1 - 1 - 2.child addr 5
2. root addr 2
但我需要另外一个数字结构,如:
1. root adrr
1-1. child adrr
1-1-1. child child addr
1-2. child addr
1-2-1. child child addr
1-3. child addr
1-3-1. child child addr
2. second root adr
2-1. child addr
2-1-1. child child addr
我需要帮助,建立这个数字,谢谢!
答案 0 :(得分:2)
您可以在不使用parent_id
字段且没有辅助strLevel
功能的情况下完成任务。
如果子节点存在,只需在函数中遍历嵌套数组,递归调用相同的函数。递归调用的函数应该从其调用者接收额外的参数$prefix
,以适当地呈现更高级别的层次结构。
在您的示例中,第二层层次结构$prefix
为1-
,第三层为1-1-
,第四层为1-1-1-
。
function printTree($arr, $prefix = "")
{
$output = "";
$index = 1;
foreach ($arr as $item) {
$output .= $prefix . $index . "." . $item["address"] . "<br/>";
if (array_key_exists("children", $item))
$output .= printTree($item["children"], $prefix . $index . "-");
$index++;
}
return $output;
}
echo printTree($testArray);
测试数组$testArray
的输出是
1. root addr
1-1. child addr
1-1-1. child addr 2
1-1-1-1. child addr 3
1-1-2. child addr 4
1-1-3. child addr 5
2. root addr 2
P.S。:该解决方案假定您生成HTML作为输出。如果您要将输出发送到控制台,请不要忘记将<br/>
更改为\n
。