【问题标题】:Get all the latest children获取所有最新的孩子
【发布时间】:2011-11-10 16:36:05
【问题描述】:

我需要一点帮助。我的算法知识很薄弱。我无法在 PHP 中编写返回所有最新子级的递归函数。

假设我们的数组如下所示:

Array
(
[0] => Array
    (
        [id_category] => 1
        [name] => Accueil
        [id_parent] => 0
    )

[1] => Array
    (
        [id_category] => 2
        [name] => Accessoires
        [id_parent] => 1
    )

[2] => Array
    (
        [id_category] => 3
        [name] => Merchandising
        [id_parent] => 1
    )

[3] => Array
    (
        [id_category] => 4
        [name] => Pièces détachées
        [id_parent] => 1
    )

[4] => Array
    (
        [id_category] => 5
        [name] => Excavateur
        [id_parent] => 4
    )

[5] => Array
    (
        [id_category] => 6
        [name] => série 100
        [id_parent] => 5
    )

[6] => Array
    (
        [id_category] => 7
        [name] => above
        [id_parent] => 6
    )

[7] => Array
    (
        [id_category] => 8
        [name] => système hydraulique
        [id_parent] => 7
    )

[8] => Array
    (
        [id_category] => 9
        [name] => série 200
        [id_parent] => 5
    )

[9] => Array
    (
        [id_category] => 10
        [name] => thru
        [id_parent] => 6
    )

[10] => Array
    (
        [id_category] => 11
        [name] => Compaction
        [id_parent] => 4
    )

[11] => Array
    (
        [id_category] => 12
        [name] => système électrique
        [id_parent] => 7
    )

)

我想要getLastChildren (5) 或getLastChildren (6) 或getLastChildren (7),该函数返回一个答案数组(“8”、“12”)

我会试着举个例子。

如果我选择第 5 类: = 6 和 9 是孩子。

我会看穿孩子们。孩子 6 有两个孩子,7 和 10,孩子 9:没有孩子。

我把 9 放在孩子列表中。

孩子 7 有两个孩子,8 和 12。8 没有孩子。 12 没有孩子。我加了 8 和 12。

所以我们返回 (9,8,12) 10 没有孩子。我也补充了。

最后我(9,8,12,10)

那么我会怎么做,如果我搜索“类别 7 中的所有最后一个孩子”=> 8 和 12。我希望我的解释“更清楚一点”。

【问题讨论】:

  • “最新的孩子”是如何定义的?
  • 看起来一个类别可以有多个孩子。在这种情况下,最后一个?
  • getLastChildren(n) 应该返回以 n 为根的子树的所有叶子吗?
  • @Raphaël:请使用var_export (fr.php.net/manual/fr/function.var-export.php) 而不是print_r,我们更容易拾取阵列。

标签: php recursion


【解决方案1】:

我会这样做:

$array = array(
    array (
        'id_category' => 1,
        'name' => 'Accueil',
        'id_parent' => 0,
    ),
    array (
        'id_category' => 2,
        'name' => 'Accessoires',
        'id_parent' => 1,
    ),
    array (
        'id_category' => 3,
        'name' => 'Merchandising',
        'id_parent' => 1,
    ),
    array (
        'id_category' => 4,
        'name' => 'Pièces détachées',
        'id_parent' => 1,
    ),
    array (
        'id_category' => 5,
        'name' => 'Excavateur',
        'id_parent' => 4,
    ),
    array (
        'id_category' => 6,
        'name' => 'série 100',
        'id_parent' => 5,
    ),
    array (
        'id_category' => 7,
        'name' => 'above',
        'id_parent' => 6,
    ),
    array (
        'id_category' => 8,
        'name' => 'système hydraulique',
        'id_parent' => 7,
    ),
    array (
        'id_category' => 9,
        'name' => 'série 200',
        'id_parent' => 5,
    ),
    array (
        'id_category' => 10,
        'name' => 'thru',
        'id_parent' => 6,
    ),
    array (
        'id_category' => 11,
        'name' => 'Compaction',
        'id_parent' => 4,
    ),
    array (
        'id_category' => 12,
        'name' => 'système électrique',
        'id_parent' => 7,
    ),
);

我拆分数据和代码,代码如下:

$children = array();
function getLastChildren($array, $parent) {
global $children;
    foreach ($array as $key => $value) {
        if ($value['id_parent'] == $parent) {
            if (hasChild($array, $value['id_category'])) {
                getLastChildren($array, $value['id_category']);
            } else {
                $children[] = $value['id_category'];
            }
        }
    }
}

function hasChild($array, $parent) {
    foreach ($array as $key => $value) {
        if ($value['id_parent'] == $parent) {
            return true;
        }
    }
    return false;
}

getLastChildren($array, 5);
print_r($children);

输出:

Array
(
    [0] => 8
    [1] => 12
    [2] => 10
    [3] => 9
)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-19
    • 2018-01-29
    • 2015-05-16
    • 1970-01-01
    • 1970-01-01
    • 2014-03-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多