Ограничение количества повторений функции в php codeigniter

Я хочу создать многоуровневую иерархическую опцию выбора для выбора родительского или любой из его дочерних категорий в codeigniter. Я хочу ограничить уровень иерархии до 3. Т.е. опция должна показывать parent, его дочерний элемент первого уровня и дочерний элемент второго уровня с дочерней категорией с отступом справа от родительского элемента. У меня нет проблем с прохождением всех уровней иерархии. Но я не могу сгенерировать опцию выбора до определенного уровня иерархии. Три уровня иерархии - это то, что мне нужно в моем случае. Кто-нибудь может мне помочь, пожалуйста.

Вот что я попробовал до сих пор:

<?php
$category = $this->get_category();

function get_category() {
    $this->db->order_by('parent_id', 'DESC');
    $this->db->select('id, name, parent_id');
    return $this->db->get('tbl_job_category')->result_array();
}

/*
*$category contains the following json data obtained from DB
$category = [{"id":"20","name":"MVC","parent_id":"16"},
{"id":"16","name":"Spring","parent_id":"14"},
{"id":"12","name":"Car Driver","parent_id":"13"},
{"id":"6","name":"Electrical","parent_id":"5"},
{"id":"3","name":"Civil","parent_id":"5"},
{"id":"14","name":"java","parent_id":"2"},
{"id":"15","name":"javascript","parent_id":"2"},
{"id":"17","name":"Computer Operator","parent_id":"1"},
{"id":"2","name":"Programming","parent_id":"1"},
{"id":"4","name":"Networking","parent_id":"1"},
{"id":"11","name":"Hardware","parent_id":"1"},
{"id":"13","name":"Driver","parent_id":"0"},
{"id":"5","name":"Engineering","parent_id":"0"},
{"id":"19","name":"Economics","parent_id":"0"},
{"id":"1","name":"Information Technology","parent_id":"0"}];
*/

$category_options = $this->multilevel_select($category);

function multilevel_select($array,$parent_id = 0,$parents = array()) {
    static $i=0;
    if($parent_id==0)
    {
        foreach ($array as $element) {
            if (($element['parent_id'] != 0) && !in_array($element['parent_id'],$parents)) {
                $parents[] = $element['parent_id'];
            }
        }
    }

    $menu_html = '';
    foreach($array as $element){
        if($element['parent_id']==$parent_id){
            $menu_html .= '<option>';
            for($j=0; $j<$i; $j++) {
                $menu_html .= '&mdash;';
            }
            $menu_html .= $element['name'].'</option>';
            if(in_array($element['id'], $parents)){
                $i++;
                $menu_html .= $this->multilevel_select($array, $element['id'], $parents);
            }
        }
    }
    $i--;
    return $menu_html;
}

echo $category_options;

1 ответ

Решение

Ограничение рекурсии включает три этапа:

  • Инициализация переменной счетчика, передаваемой в качестве параметра рекурсивной функции.
  • Тестирование значения счетчика по отношению к желаемой границе перед повторением
  • Передача увеличенного значения счетчика в случае рекурсивного вызова.

В вашем случае это будет $level переменная ниже:

function multilevel_select($array,$parent_id = 0,$parents = array(), $level=0) {
    // ....
            if(in_array($element['id'], $parents) && $level < 2){ // your boundary here, 2 for third nesting level from root

                $i++;
                $menu_html .= $this->multilevel_select($array, $element['id'], $parents, $level+1);
            }

        }
    }
    $i--;
    return $menu_html;
}
Другие вопросы по тегам