Получить все млм нижестоящие линии (php)

Я хочу получить все нижние линии отца в двоичном дереве, каждый отец имеет левую и правую руки, каждая рука имеет левую и правую руки и т. Д., Как показано на следующем рисунке. В моей базе данных у меня есть таблица с именем users, у каждого пользователя есть идентификатор отца и позиция, которая является L или R.

Вот моя функция... но она все еще не получает все нижестоящие. как на следующем изображении.

1 ответ

Решение

Две вещи выделяются для меня:

  1. $i аргумент и использование $this->downline_id_arr,

Подумайте над тем, чтобы сделать:

$children = array();
foreach($data as $row) {
    $child_id = $row->id;
    $children[$child_id] = array(/**/);
    $children = array_merge($children, $this->getAllDownline($child_id);
}
return $childen;

Теперь вам не нужно $i переменная или $this->downline_id_arr,

  1. Вы запрашиваете каждый узел один за другим.

Вместо этого рассмотрите возможность запроса по уровню:

function getAllDownlines($fathers) {
    $data = "SELECT * FROM users WHERE father_id IN (/*fathers*/)";
    $new_father_ids = array();
    $children = array();
    foreach ($data as $child) {
        $children[$child->id] = array(/**/); // etc

        $new_father_ids[] = $child->id;
    }
    $children = array_merge($children, $this->getAllDownlines($new_father_ids);
    return $childen;
}

Обычно меньше запросов выполняется быстрее, поэтому вы должны увидеть лучшую производительность.

Другие вопросы по тегам