Как построить динамически многоуровневую категорию с PHP [duplicate]

В то время как обещания и обратные вызовы хорошо работают во многих ситуациях, боль в задней части выражает нечто вроде:

if (!name) {
  name = async1();
}
async2(name);

. В итоге вы пройдете через async1; проверьте, не определено ли name или нет, и соответственно вызовите обратный вызов.

async1(name, callback) {
  if (name)
    callback(name)
  else {
    doSomething(callback)
  }
}

async1(name, async2)

Хотя в в порядке хорошо , это раздражает, когда у вас много подобных случаев и обработка ошибок.

Fibers помогает в решении проблемы.

var Fiber = require('fibers')

function async1(container) {
  var current = Fiber.current
  var result
  doSomething(function(name) {
    result = name
    fiber.run()
  })
  Fiber.yield()
  return result
}

Fiber(function() {
  var name
  if (!name) {
    name = async1()
  }
  async2(name)
  // Make any number of async calls from here
}

Вы можете проверить проект здесь .

5
задан Vaiman Hunor 1 April 2015 в 06:49
поделиться

1 ответ

Вам не нужно создавать 2 таблицы в базе данных, для этого вы можете поддерживать его, как показано ниже, только из одной таблицы

+-------+---------------+---------------------------+
|   id  |   parent_id   |           title           |
+-------+---------------+---------------------------+
|   1   |       0       |   Parent Page             |
|   2   |       1       |   Sub Page                |
|   3   |       2       |   Sub Sub Page            |
|   4   |       0       |   Another Parent Page     |
+-------+---------------+---------------------------+

Созданный массив будет похож на

Array
(
    [0] => Array
        (
            [id] => 1
            [parent_id] => 0
            [title] => Parent Page
            [children] => Array
                        (
                            [0] => Array
                                (
                                    [id] => 2
                                    [parent_id] => 1
                                    [title] => Sub Page
                                    [children] => Array
                                                (
                                                    [0] => Array
                                                        (
                                                            [id] => 3
                                                            [parent_id] => 1
                                                            [title] => Sub Sub Page
                                                        )
                                                )
                                )
                        )
        )
    [1] => Array
        (
            [id] => 4
            [parent_id] => 0
            [title] => Another Parent Page
        )
)

Для достижения этой цели вам нужно использовать рекурсивную функцию

function buildTree(array $elements, $parentId = 0) {
    $branch = array();

    foreach ($elements as $element) {
        if ($element['parent_id'] == $parentId) {
            $children = buildTree($elements, $element['id']);
            if ($children) {
                $element['children'] = $children;
            }
            $branch[] = $element;
        }
    }

    return $branch;
}

$tree = buildTree($rows);

. Алгоритм довольно прост:

  1. Возьмите массив всех элементов и идентификатор текущий родительский элемент (изначально 0 / ничего / null / безотносительно).
  2. Прокрутите все элементы.
  3. Если parent_id элемента совпадает с текущим родительским идентификатором, который вы получили в 1., element - дочерний элемент родителя. Поместите его в список текущих детей (здесь: $ branch).
  4. Вызвать функцию рекурсивно с идентификатором элемента, который вы только что идентифицировали в 3., т. Е. Найти всех дочерних элементов этого элемента и добавить их как элемент children.
  5. Верните список найденных детей.
23
ответ дан Veerendra 27 August 2018 в 11:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: