@_ne_scaju_, тем что цикл в цикле - это надо заранее знать глубину вложенности, при глубине вложенности "без разницы" очень помогает рекурсия.
PHP: class myRecursion { public function method_myRecursion($_element) { if (is_array($_element)) { foreach ($_element as $_value) { $this->method_myRecursion($_value); } } else { echo '<div>'. $_element .'</div>'; } } } $result = new myRecursion(); $_myArray = array('1' => array('A', 'B', 'C'), '2' => array('D', 'E', 'F'), '3' => array('G', 'H', 'I') ); $result -> method_myRecursion( $_myArray ); result: A B C D E F G H I нашел вот такую рекурсии, как она тебе, я смотрел примеры, вообще лучше пока не нашел.
ребята не когда не пользовался рекурсией пока не въеду как ее реализовать( пока накидал так но не чего не получается: PHP: public function getCategoriesList() { return $this -> db -> sel('SELECT * FROM `game_categories` WHERE `category_status` = 1'); } # Получаем из бд массив вложенный массив public function getTree( $dataset ) { $tree = []; foreach ( $dataset = self::getCategoriesList() as $id => $test) { if ( !$test['parent_id'] ) { $tree[$id] = $test; } else { $dataset[$test['parent_id']][$id]['category_id'] = $test; } } return $tree; } получается выводится опять же меню, а подменю не выводится. в шаблоне осталось так же. Спойлер: шаблон PHP: <?php foreach ( $listCategory as $key => $ctg ): ?> <div class="list-group-item list-group-item-action category-group-title" data-target="#collapse<?php echo $ctg['category_id']; ?>" data-toggle="collapse"> <h5><?php echo $ctg['category_name']; ?></h5> </div> <div class="collapse" id="collapse<?php echo $ctg['category_id']; ?>"> <a style="color: red;" class="list-group-item list-group-item-action" href="/category/<?php echo $ctg['category_id']; ?>"> { <?php echo $ctg['category_name'][$key]; ?> } </a> </div> <?php endforeach; ?> может что в шаблоне нужно изменить?
А где ты показываешь что ты делаешь, кто знает содержание твоих переменных? var_export() массивов, дамп базы, sql песочница с запросами - тогда может будет понятно.
@_ne_scaju_, как только ты начинаешь гуглить и качать скрипт, ты уже всё делаешь не так. Пиши все сам.
ок, таблица: Спойлер: дамп категорий Код (Text): CREATE TABLE `game_categories` ( `category_id` int(11) NOT NULL COMMENT 'идентификатор категории', `parent_id` int(11) NOT NULL COMMENT 'родительский id', `category_name` varchar(255) NOT NULL COMMENT 'Название категории которое будет отображаться в меню', `category_status` int(11) NOT NULL DEFAULT '1' COMMENT '1 отображать 0 не отображать категорию' ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='Категория игр'; -- -- Дамп данных таблицы `game_categories` -- INSERT INTO `game_categories` (`category_id`, `parent_id`, `category_name`, `category_status`) VALUES (1, 0, 'WORLD OF TANKS', 1), (2, 0, 'WORLD OF WARSHIPS', 1), (3, 0, 'ИГРЫ STEAM', 1), (4, 0, 'DOTA 2', 1), (5, 0, 'ROYAL QUEST', 1), (6, 0, 'CSGO', 1), (7, 0, 'ДРУГИЕ', 1), (8, 1, 'wot-1', 1), (9, 1, 'wot-2', 1), (10, 1, 'wot-3', 1), (11, 1, 'wot-5', 1), (12, 4, 'dota-1', 1), (13, 4, 'dota-2', 1), (14, 4, 'dota-3', 1), (15, 6, 'CS-1', 1), (16, 6, 'CS-2', 1), (17, 6, 'CS-3', 1), (18, 2, 'warship-1', 1), (19, 2, 'warship-2', 1), (20, 7, 'dr-1', 1), (21, 7, 'dr-2', 1), (22, 7, 'dr-3', 1); далее код повторяю, в моделе я делаю запрос, на вывод содержимого этой таблицы, дамп выше. и после того как выполнил запрос, передаю его в метод который переберает массив: Спойлер: модель PHP: public function getCategoriesList() { return $this -> db -> sel('SELECT * FROM `game_categories` WHERE `category_status` = 1'); } # Получаем из бд массива вложенный массив public function getTree( $dataset ) { $tree = []; foreach ( $dataset = self::getCategoriesList() as $id => $node ) { if ( !$node['parent_id'] ) { $tree[$id] = $node; } else { $dataset[$node['parent_id']][$id]['category_id'] = $node; } } return $tree; } далее контроллер просит модель, у метода getTree() отдать данные для вывода категорий и подкатегорий: Спойлер: контроллер PHP: public function indexAction() { # Список категорий игровых для левого меню $category = new CategoryGame(); $listCategory = $category -> getTree( null ); //echo '<pre>'; //var_dump ( $listCategory ); //echo '</pre>'; # Список последних игр $product = new UserProductGame(); $listGame = $product -> getLatestProducts(8); # Список рекомендуемых игр для слайдера $listSliderGame = $product -> getRecommendedProducts(); # Подключаем вид require_once('app/views/main/index.php'); return true; } вардам мне выдает такое: Спойлер: var_dump() Код (Text): array(7) { [0]=> array(4) { ["category_id"]=> string(1) "1" ["parent_id"]=> string(1) "0" ["category_name"]=> string(14) "WORLD OF TANKS" ["category_status"]=> string(1) "1" } [1]=> array(4) { ["category_id"]=> string(1) "2" ["parent_id"]=> string(1) "0" ["category_name"]=> string(17) "WORLD OF WARSHIPS" ["category_status"]=> string(1) "1" } [2]=> array(4) { ["category_id"]=> string(1) "3" ["parent_id"]=> string(1) "0" ["category_name"]=> string(14) "ИГРЫ STEAM" ["category_status"]=> string(1) "1" } [3]=> array(4) { ["category_id"]=> string(1) "4" ["parent_id"]=> string(1) "0" ["category_name"]=> string(6) "DOTA 2" ["category_status"]=> string(1) "1" } [4]=> array(4) { ["category_id"]=> string(1) "5" ["parent_id"]=> string(1) "0" ["category_name"]=> string(11) "ROYAL QUEST" ["category_status"]=> string(1) "1" } [5]=> array(4) { ["category_id"]=> string(1) "6" ["parent_id"]=> string(1) "0" ["category_name"]=> string(4) "CSGO" ["category_status"]=> string(1) "1" } [6]=> array(4) { ["category_id"]=> string(1) "7" ["parent_id"]=> string(1) "0" ["category_name"]=> string(12) "ДРУГИЕ" ["category_status"]=> string(1) "1" } } ок, и в самом шаблоне который подключаю в контроллере стараюсь вывести категории с подкатегориями: Спойлер: шаблон HTML: <div class="well"> <h3><span class="glyphicon glyphicon-th-list"></span> Категории</h3> <hr> <div class="row"> <div class="col-lg-12"> <div class="list-group"> <?php foreach ( $listCategory as $key => $ctg ): ?> <div class="list-group-item list-group-item-action category-group-title" data-target="#collapse<?php echo $ctg['category_id']; ?>" data-toggle="collapse"> <h5><?php echo $ctg['category_name']; ?></h5> </div> <div class="collapse" id="collapse<?php echo $ctg['category_id']; ?>"> <a style="color: red;" class="list-group-item list-group-item-action" href="/category/<?php echo $ctg['category_id']; ?>"> { <?php echo $ctg['category_name'][$key]; ?> } </a> </div> <?php endforeach; ?> </div> </div> </div> </div> где в этот кусок должны выводиться подкатегории Спойлер: кусок шаблона HTML: <div class="collapse" id="collapse<?php echo $ctg['category_id']; ?>"> <a style="color: red;" class="list-group-item list-group-item-action" href="/category/<?php echo $ctg['category_id']; ?>"> { <?php echo $ctg['category_name'][$key]; ?> } </a> </div> ну что я не правильно делаю, объясните мне пожалуйста, спасибо. --- Добавлено --- как можно писать самому если я даже не когда не пробовал делать рекурсию, с прочитанного понял, что это функция вызывающая саму себя, и не более.
@_ne_scaju_ Я говорил var_export(), не var_dump() И заполнить базу можно было как-то осмысленне: категория - комп игры под-категория - военные под-под-категория - сухопутные под-под-под-категория - танки
как можно писать самому если я даже не когда не пробовал делать рекурсию, с прочитанного понял, что это функция вызывающая саму себя и не более. ок вот: Спойлер: var_export Код (Text): array ( 0 => array ( 'category_id' => '1', 'parent_id' => '0', 'category_name' => 'WORLD OF TANKS', 'category_status' => '1', ), 1 => array ( 'category_id' => '2', 'parent_id' => '0', 'category_name' => 'WORLD OF WARSHIPS', 'category_status' => '1', ), 2 => array ( 'category_id' => '3', 'parent_id' => '0', 'category_name' => 'ИГРЫ STEAM', 'category_status' => '1', ), 3 => array ( 'category_id' => '4', 'parent_id' => '0', 'category_name' => 'DOTA 2', 'category_status' => '1', ), 4 => array ( 'category_id' => '5', 'parent_id' => '0', 'category_name' => 'ROYAL QUEST', 'category_status' => '1', ), 5 => array ( 'category_id' => '6', 'parent_id' => '0', 'category_name' => 'CSGO', 'category_status' => '1', ), 6 => array ( 'category_id' => '7', 'parent_id' => '0', 'category_name' => 'ДРУГИЕ', 'category_status' => '1', ), )
Хотя бы нормально вопросы формулировать нужно. PHP: SELECT category_name, games FROM ( SELECT cat_id, GROUP_CONCAT( CONCAT_WS(': status ',g.category_name, g.category_status)) games FROM ( SELECT `category_name` c_name, `category_id` cat_id FROM `game_categories` WHERE `parent_id` = 0 ) AS c JOIN `game_categories` g ON (`cat_id` = `parent_id`) GROUP BY cat_id ) AS s JOIN `game_categories` ON (`category_id` = `cat_id`)
сегодня покажу переделанный под себя вариант) который я нашел в инете, если сделаю) ответ я дал правильный, я типа спросил у себя и сам себе ответил, это была задумка такая
@_ne_scaju_ Твоя таблица с одним уровнем категорий это вообще ни о чем, попробуй с пятью. Так чтобы готовый массив: PHP: SELECT category_name, CONCAT('["',games,']') games FROM ( SELECT cat_id, GROUP_CONCAT( CONCAT_WS('" => ',g.category_name, g.category_status) SEPARATOR ', "') games FROM ( SELECT `category_name` c_name, `category_id` cat_id FROM `game_categories` WHERE `parent_id` = 0 ) AS c JOIN `game_categories` g ON (`cat_id` = `parent_id`) GROUP BY cat_id ) AS s JOIN `game_categories` ON (`category_id` = `cat_id`)
зачем, пока у меня не будет вложености на 5 подкатегории, думаю это не нужно. --- Добавлено --- учту это.
А нафига тогда брался за это дерево? Там left join чтобы все выбрать: PHP: SELECT category_name, CONCAT('[',games,']') games FROM ( SELECT cat_id, GROUP_CONCAT( CONCAT_WS(' => ',CONCAT('"', g.category_name, '"'), g.category_status)) games FROM ( SELECT `category_name` c_name, `category_id` cat_id FROM `game_categories` WHERE `parent_id` = 0 ) AS c LEFT JOIN `game_categories` g ON (`cat_id` = `parent_id`) GROUP BY cat_id ) AS s JOIN `game_categories` ON (`category_id` = `cat_id`)
мне предложили рекурсию вот я и ее пробую до сих пор сделать, почему-то не получилось под себя допилить(.
https://medium.com/@nagar_75/стек-вызова-функций-call-stack-in-programming-languages-2bf8da4012cc - вот ключевое, что надо понимать о рекурсии.
@_ne_scaju_, рекурсия не только вызывает саму себя, но и как любая нормальная функция возвращает управление тому кто её вызвал. В случае рекурсии возвращает самой себе, ровно на один раз меньше количества вызовов этой функции, плюс последний возврат в основную программу. В итоге количество возвратов, равно количеству вызовов.
я до сих пор не могу обработать эту с у.. пер рекурсию( может кто поможет? PHP: public $categories = []; # публик переменная для список всех категорий public $categoriesTree = []; # публик переменная для список категорий в форме дерева public function __construct() { parent::__construct(); # вызываем родительский конструктор Model $this -> categories = $this -> getCategories(); // $this -> categoriesTree = $this -> getFullTree(); } /* * Список всех категорий */ private function getCategories(){ $arr_cat = []; $result = $this -> db -> sel("SELECT * FROM `game_categories`"); foreach($result AS $category) { $arr_cat[$category['category_id']] = $category; } return $arr_cat; } /* * Список категорий, в форме дерева */ public function getFullTree($categories) { // $categories = $this -> categories; $tree = [] ; foreach($categories as $id => &$node) { if(!$node['parent_id']){ $tree[$id] = &$node ; }else{ $categories[$node['parent_id']]['children'][$id] = &$node ; } } return $tree; } public function showCat( $categories ) { echo '<pre>'; var_dump($categories); echo '</pre>'; } в первой функции получаю список всех категорий подкатегорий во второй функции получаю форму дерева из полученного массива и в третей функции по логике нужно сформировать сам вывод, этого дерева, но сколько не пытался у меня не чего не получилось( может кто подкинет идейку, спасибо, я уже много пересмотрел этих деревьев поверьте но так и не смог разобраться, сразу меня не пинайте ок?
долбанное дерево) иногда некогда решать эту задачу, как начинаю смотреть на нее так сразу хочется бросить программировать.
просто же всё за два то с половиной года некоторые уже в офисе давно работают и пользу приносят миру и такими примитивными вопросами давно не задаются --- Добавлено --- коллеги, восхищаюсь вашим терпением
да ну это же не обязательно, что я php каждый день учу, тем более 2 с половиной года, я максимум его 6 месяцев учу а может быть и меньше, разбираюсь пытаюсь понять этот язык. Да и практики у меня маловато. Да и так подумать, а может у меня свои дела работа учеба, что я не успеваю его даже учить, серьезно. Да возможно на форуме я уже 2 с половиной года, а толку? просто провожу время общаясь с форумом. Объясните мне логику что должно происходить в этом дереве, а я попробую его построить, спасибо.
@_ne_scaju_ что должно происходить - это ты нам скажи. Может заново сформулируешь что ты хочешь получить в итоге? В начальном посте ты описал задачу так, что в ней присутствует кусок структуры бд (как тебе это виделось в тот момент). И это было неправильно. Дай нам только цель. Что ты хочешь получить на выходе?