【发布时间】:2017-12-18 22:41:24
【问题描述】:
我正在尝试创建一个简单的树结构,其中每个任务都有一定的完成百分比,并且其父级必须继承其直接子级的平均完成率,如下图所示。 (0 是完成的百分比,例如 subtask2 可能是 100%,subtask2 可能是 0%,这将使 task1 完成 50%,因此 stackoverflow 将有 25%,假设 task2 为 0)
我遇到的问题是,显然,我需要从最深的孩子开始,但我似乎无法弄清楚如何实现从叶子到根的这种反向遍历。
我尝试过使用普通递归和双循环,两者都只实现一级计算(在图片示例中 task1 被计算,但 stackoverflow 将保持为 0)。
注意:只有叶子实际上可以有完成百分比,因为不是叶子的所有其他元素都从其子元素继承百分比。 (多么自相矛盾)
如果你们中的任何人对如何实现这样的算法有任何想法,无论是概念上的还是实际的代码,我都非常感谢任何输入。
下面是这个数组的结构(只保留了相关信息):
[0] => Array
(
[title] => stackoverflow
[completion] => 0
[children] => Array
(
[0] => Array
(
[title] => task2
[completion] => 0
)
[1] => Array
(
[title] => task1
[completion] => 0
[children] => Array
(
[0] => Array
(
[title] => subtask2
[completion] => 100
)
[1] => Array
(
[title] => subtask1
[completion] => 0
)
)
)
)
)
我似乎遇到了与此线程中的问题类似的问题:Percentages and trees 但是,我需要我的任务有实际百分比,而不仅仅是完成/未完成。所有的数学都是完全线性的,这意味着父母的百分比=(所有孩子百分比的加法)/(孩子的数量)
还有 var_export:
array (
0 =>
array (
'uuid' => '157ed2b2-0d0c-4f0c-b1d2-7126255f4023',
'title' => 'stackoverflow',
'completed' => '0',
'parent' => NULL,
'children' =>
array (
0 =>
array (
'uuid' => '72ce49a6-76e5-495e-a3f8-0f13d955a3b5',
'title' => 'task2',
'completed' => '0',
'parent' => '157ed2b2-0d0c-4f0c-b1d2-7126255f4023',
),
1 =>
array (
'uuid' => '4975d08d-55f0-4cd8-9de5-2d056111ec2d',
'title' => 'task1',
'completed' => '0',
'parent' => '157ed2b2-0d0c-4f0c-b1d2-7126255f4023',
'children' =>
array (
0 =>
array (
'uuid' => 'ac5e9d37-8f14-4169-bcf2-e7b333c5faea',
'title' => 'subtask2',
'completed' => '0',
'parent' => '4975d08d-55f0-4cd8-9de5-2d056111ec2d',
),
1 =>
array (
'uuid' => 'f74b801f-c9f1-40df-b491-b0a274ffd301',
'title' => 'subtask1',
'completed' => '0',
'parent' => '4975d08d-55f0-4cd8-9de5-2d056111ec2d',
),
),
),
),
),
)
【问题讨论】:
-
你的输入数组是什么样的?
-
刚刚添加 :)
-
请使用
var_export作为您的数组,而不是var_dump,以便我们复制/粘贴它。 -
也添加了 var_export,尽管我在格式化方面遇到了一些问题