php - 如何将嵌套集模型数据格式化为数组?

标签 php nested-set-model

让我们马上深入研究主要问题,我有这样的输入

$category = array(
  'A' => array('left' => 1, 'right' => 8),
  'B' => array('left' => 2, 'right' => 3),
  'C' => array('left' => 4, 'right' => 7),
  'D' => array('left' => 5, 'right' => 6),
  'E' => array('left' => 9, 'right' => 10),
);

我希望输出是这样的

$tree = array(
  array('A', 'B'),
  array('A', 'C', 'D'),
  array('E'),
);

循环输入数组并像这样创建输出结果的最佳且快速的函数是哪个?

最佳答案

使用嵌套集是递归的完美案例。

鉴于您的数据:

$category = array(
    'A' => array('left' => 1, 'right' => 9),
    'B' => array('left' => 2, 'right' => 4),
    'C' => array('left' => 5, 'right' => 8),
    'D' => array('left' => 6, 'right' => 7),
    'E' => array('left' => 10, 'right' => 11),
);

以下将在 PHP 中将嵌套的集合数据分解为正确嵌套的数组:

function createTree($category, $left = 0, $right = null) {
    $tree = array();
    foreach ($category as $cat => $range) {
        if ($range['left'] == $left + 1 && (is_null($right) || $range['right'] < $right)) {
            $tree[$cat] = createTree($category, $range['left'], $range['right']);
            $left = $range['right'];
        }
    }
    return $tree;
}

$tree = createTree($category);
print_r($tree);

输出:

Array
(
    [A] => Array
        (
            [B] => Array
                (
                )

            [C] => Array
                (
                    [D] => Array
                        (
                        )

                )

        )

    [E] => Array
        (
        )

)

然后您可以使用以下命令将正确的树展平为您想要的格式:

function flattenTree($tree, $parent_tree = array()) {
    $out = array();
    foreach ($tree as $key => $children) {
        $new_tree = $parent_tree;
        $new_tree[] = $key;
        if (count($children)) {
             $child_trees = flattenTree($children, $new_tree);
            foreach ($child_trees as $tree) {
                $out[] = $tree;
            }
        } else {
            $out[] = $new_tree;
        }
    }
    return $out;
}

$tree = flattenTree($tree);
print_r($tree);

输出:

Array
(
    [0] => Array
        (
            [0] => A
            [1] => B
        )

    [1] => Array
        (
            [0] => A
            [1] => C
            [2] => D
        )

    [2] => Array
        (
            [0] => E
        )

)

关于php - 如何将嵌套集模型数据格式化为数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16999530/

相关文章:

sql - jOOQ复杂更新-如何锁定表?

php - 使用序列化将数组存储在数据库中,但在 php 中反序列化时出现偏移错误。

php - 具有 Laravel 关系的 MySQL 嵌套集模型

php - MySQL在大数据列表上自动生成嵌套集合模型?

php - 2 个表单调用相同的 Javascript 函数?

sql - 按名称对嵌套集进行排序,同时保持深度完整性

jquery - 如何使用 AJAX 更新 simple_form 输入字段?

php - 如何使用 AngularJS 或 jQuery 更改 HTML 表格中的文本颜色?

php - 处理电子商务网站更新的最佳方式是什么?

php - 安全措施 - 何时以及如何