всем привет! есть такой массив Код (Text): [5] => Array ( [category_id] => 5 [category_name] => категория 1 [parent_id] => 0 [childs] => Array ( [15] => Array ( [category_id] => 15 [category_name] => категория 1.1 [parent_id] => 5 ) [16] => Array ( [category_id] => 16 [category_name] => категория 1.2 [parent_id] => 5 [childs] => Array ( [18] => Array ( [category_id] => 18 [category_name] => категория 1.2.1 [parent_id] => 16 ) [19] => Array ( [category_id] => 19 [category_name] => категория 1.2.2 [parent_id] => 16 ) ) ) ключ к массиву достаю из GET запроса.. как мне обратиться к конкретному массиву и вытащить из него вложенные массивы? два дня сижу)
вот такая функция у меня есть Код (Text): function list_category($array, $category_id){ if(!$category_id) return false; $list_category = array(); if($array[$category_id]){ $list_category = $array[$category_id]['childs'] ; } return $list_category; } но она только из корневых достает массивы и целиком весь вложенный массив
вы спросили как обратиться к конкретному - вам ответили. Что вы хотите то конкретно? Выводить древовидное меню типа? почитайте насчет рекурсивных функций, тут без этого не обойтись
Как обращаться к многомерному массиву вам выше написали. Для обхода деревьев же нужна рекурсивная функция типа: PHP: function tree_processing($branch){ foreach($branch as $leaf){ if (is_array($leaf)){ // or if (isset($leaf['childs'])), if (isset($leaf['is_branch'])) etc tree_processing($leaf); } else{ //do something with items in branch... } //do something with any type... } //do something globally... }
спасибо, сейчас почитаю.. да, я хотел древовидное меню получить.. вернее уже получил, вывел тыря чужой кодинг. а тут решил изменить кое что и понеслось я тут еще потом потуплю немного, вы уж потерпите
из разряда "я вас наверное уже достал, но вот мой вопрос..." ты правда веришь в то, что люди, которые сидят на этом форуме - приходят сюда "потерпеть"? Спойлер: Реальность
так то да, спойлер хорош.. ну вобще думаю - для того чтобы помогать, тем, кто не соображает, надо обладать определенным терпением а если вам 'спойлер', то никто вроде вам не названивает на мобильный и не пишет слезных смс с криками о помощи я кстати, где-то тут видел раздел 'php для профи' попробуйТе там посмотреть
вот именно. сюда ходят не за этим, хотя от куда мне знать. Просто спрашивай и просто получай ответы. Ни кто тебя не терпит. --- Добавлено --- твой код, как всегда, прекрасен.
в общих чертах, но как ко мне применить я вобще непойму думаю надо как то пройтись по массиву $categories_tree и проверить есть ли во вложенных категориях, категории с ключем [childs] если нет, то выводить товары(уже выводит).. а если есть — категории. я уже создавал тему в php и msql, но там слишком много набросал, думаю никто не ответит. тут можно темы свои удалять?
Значит непонятно. В общих чертах можно смысл произведений Грибоедова понять. А код ты или понимаешь, или нет. Это функция. Она на вход принимает "ветвь дерева". То бишь массив. И по одному перебирает элементы этого массива. Если какой-то из элементов массива имеет признаки того, что он тоже ветвь, он отправляется в эту же функцию. Внутри функции происходит вызов ее же самой. Но уже для вложенной ветви. В это время предыдущая функция, само собой, "встает на паузу", пока не закончится новая. И так по кругу. Этот метод позволяет полностью обойти все дерево. Из этой функции можно делать return, а в строчке с ее вызовом сохранять ее результат в переменную. Таким образом мы можем рекурсивно собрать с дерева все, что угодно. Если же элемент не ветвь, мы делаем что-то, что хотим с ним сделать. Ну и отдельно, вне всего этого, по желанию еще какой-то код перед завершением. Эта функция - каркас, а не готовое решение. В текущем виде она не делает ничего, кроме рекурсивного обхода. Но из нее можно слепить что угодно. --- Добавлено --- Выглядит как сарказм. Там что-то не так?
т е нет. тут всё довольно просто. Это рекурсивная функция (функция, которая вызывает саму себя) То, что ты называешь древовидным массивом называется "многомерный массив". Это значит, что элемент массива сам может быть массивом и так, теоретически, не ограниченное количество раз. Эта функция перебирает массив, и, если элемент массива сам является массивом, то вызывает себя же и перебирает уже вложенный массив. Если она в этом вложенном массиве встретит массив, то переберет и его. И так далее. Тебе осталось только дописать в эту функцию действия, которые надо проделать с элементом. Если что-то не понятно - спрашивай. --- Добавлено --- доля сарказма есть, но там всё так)
если бы так мануалы были написанны, как вы объясняете, уже бы все php выучили.. спасибо за ответы, пойду переваривать и пытаться что то написать. потом покажу, что ̶п̶о̶л̶у̶ч̶и̶л̶о̶с̶ь̶ не получилось ))
В документации есть такая полезная штука,которую почему то мало кто читает, User Contributed Notes называется.Вот там многие моменты освещают,например здесь https://secure.php.net/manual/ru/features.file-upload.post-method.php где объясняют загрузку файлов методом POST можно узнать что если использовать все как в примере - получишь шелл на сайт.
Древовидный массив это древовидный массив. Дерево, наряду со одно/двусвязным списком, словарем, стэком и пр - это название конкретной структуры данных. Да, в PHP оно реализуется с помощью неоднородного массива, где некоторые элементы могут быть N-мерными. Но это специфика PHP. В других языках деревья реализуются иначе. Даже в PHP их можно реализовать иначе. Как с C#, например, где каждый узел дерева - это объект. С методами, свойствами и тд. Опционально хранящий в себе такие же узлы, предоставляющий методы для работы с ними и для выборок, тут уж как напишешь. Итого. То, что он назвал древовидным массивом - действительно древовидный массив. Он же "дерево". Прям каноничное. Со ссылками на ветвь-родителя и все такое. --- Добавлено --- Невнимательно читаешь. Там речь идет не о примере в мануале, а о одном из таких же комментов, где кто-то посоветовал ересь.
Да,надо было перепроверить прежде чем написать, но в общем User Contributed Notes полезно читать. Я вспомнил почему у меня это отложилось в голове,потому что если брать чисто пример из документации,а именно: PHP: $uploaddir = '/var/www/uploads/'; $uploadfile = $uploaddir . basename($_FILES['userfile']['name']); echo '<pre>'; if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) { echo "Файл корректен и был успешно загружен.\n"; } else { echo "Возможная атака с помощью файловой загрузки!\n"; } echo 'Некоторая отладочная информация:'; print_r($_FILES); print "</pre>"; То собственно шелл можно тоже достаточно легко получить PS:Да,знаю,что дальше идут всяческие рекомендации,но я очень часто встречал в сайтах именно такие формы без каких либо проверок.Просто люде брали этот пример и вставляли себе
На деле, сложнее, чем кажется, если в папке-файлохранилище запретить выполнение php-скриптов Еще одна из причин, почему я рекомендую новичкам ознакомиться с линухой чем раньше, тем лучше.
вот вроде просто должно быть, а никак... Код (Text): function list_category($array, $category_id) { $branch = array(); foreach ($array as $leaf) { if ($leaf[$category_id['childs']]) { $branch[] = $leaf['childs'] ; list_category($leaf); } } return $branch; } на вход это подаю Код (Text): if(isset($_GET['category'])){ $category_id = (int)$_GET['category']; $list_category = list_category($categories_tree, $category_id); вывод пустой массив
Ну намудрил!))) Скорее всего у тебя условие не выполняется на всех итерациях цикла foreach. Но даже если будет выполняться, то ты внутри функции передаешь функции 1 параметр, а она принимает 2. Кроме того, функция даже если и выполнится, то надо куда-то наверное сохранить то, что она вернет. И еще может быть чего-то не заметил)) У меня мозг кипит от твоего кода)) А что сделать хочешь (подробно)?
https://php.ru/forum/threads/derevo-massiva-i-vyvod-podkategorij.62857/ вот я тут вроде описал, но наверно так же как и накодил выше )) тут темы можно удалять? там вряд-ли кто ответит
Причем второй параметр не имеет значения по умолчанию, и, следовательно, должна быть ошибка, которой нет. Автор, как минимум надо включить вывод ошибок на страницу. --- Добавлено --- В своей же теме на стартовое сообщение жмакаешь "пожаловаться", в тексте жалобы пишешь просьбу на удаление. И, желательно, причину для удаления. Первый же свободный модератор рассмотрит заявку.