sharomet
@sharomet
Front-End

Как получить данные с помощью рекурсии?

Подскажите, как правильно вывести подкатегории с помощью рекурсивной функции?
Я передаю в метод вот такой массив.
{
    "_id" : ObjectId("18b97aa654bce61356002559"),
    "name" : "Photo",
    "childs" : [ 
        {
            "_id" : "22b55aa654bce61356002559",//Вот эти данные нужно получить.
            "name" : "Photo childs", //Вот эти данные нужно получить.
            "childs" : "",//Вот эти данные нужно получить.
        }
    ],
}

Мне нужно получить данные всех подкатегорий. Категорий может быть бесконечное множество.

public function getChildById($arr, $id) {

	if(is_array($arr)){
				
		if((string)$arr['_id'] == $id){
				return $arr;
			}else {
				foreach ($arr as $kay => $value) {
				  $this -> getChildById($value['childs'][$kay], $id);
			        }
		}
	}
	return  false;
}


Но в итоге метод ничего не возвращает.
Где я ошибся?
  • Вопрос задан
  • 257 просмотров
Решения вопроса 2
В модели category сделал виртуальное свойство
public $childs;

в модели
/**
     * Строим дерево категории
     *
     * @param $data
     * @param int $rootID
     * @return array
     */
    protected function buildTree($data, $rootID = 0)
    {
        $tree = [];
        foreach ($data as $id => $node) {
            if ($node['parent_id'] == $rootID) {
                unset($data[$id]);
                $node['childs'] = $this->buildTree($data, $node['id']);
                $tree[] = $node;
            }
        }
        return $tree;
    }

    /**
     * Получаю все категории
     *
     * @return array
     */
    public function getAllCategories()
    {
        $data = Category::find()->asArray()->all();
        return $this->buildTree($data);
    }


в controller
$tree = $model->getAllCategories();
return $this->render('profile', ['tree' => $tree]);


во view
foreach ($tree as $cat) {
// root 1-й уровень
    echo $cat['title'];
    if ($cat['childs'] > 0) {
        foreach ($cat['childs'] as $childs) {
// category 2-й уровень
            if (empty($childs['childs'])) {
                echo  $childs['title'];
            } else {
                echo '<b><br/>' . $childs['title'] . '</b><br/>';
            }
            foreach ($childs['childs'] as $child) {
// category 3-й уровень
                echo $child['title'];
            }
        }
    }
    echo '</div>';
}
Ответ написан
romy4
@romy4
Exception handler
у вас идёт foreach() и находит по "id" нужный элемент. Что дальше? нехватает условия чтобы оно что-то вернуло в этот момент
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
sharomet
@sharomet Автор вопроса
Front-End
Решение для любого уровня)
public function getChildById($arr, $id) {
			if(is_array($arr)){
				if((string)$arr[0]['_id'] == $id){
					return $arr;
				}else {
					foreach ($arr as $kay => $value) {
						return $this -> getChildById($value['childs'], $id);
					}
				}
			}
			return  false;
		}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы