За последние 24 часа нас посетил 17591 программист и 1725 роботов. Сейчас ищут 839 программистов ...

древовидный массив

Тема в разделе "PHP для новичков", создана пользователем Иван kali, 30 мар 2017.

  1. Иван kali

    Иван kali Активный пользователь

    С нами с:
    29 мар 2017
    Сообщения:
    50
    Симпатии:
    1
    всем привет!
    есть такой массив
    Код (Text):
    1.  
    2. [5] => Array
    3.         (
    4.             [category_id] => 5
    5.             [category_name] => категория 1
    6.             [parent_id] => 0
    7.             [childs] => Array
    8.                 (
    9.                     [15] => Array
    10.                         (
    11.                             [category_id] => 15
    12.                             [category_name] => категория 1.1
    13.                             [parent_id] => 5
    14.                         )
    15.  
    16.                     [16] => Array
    17.                         (
    18.                             [category_id] => 16
    19.                             [category_name] => категория 1.2
    20.                             [parent_id] => 5
    21.                             [childs] => Array
    22.                                 (
    23.                                     [18] => Array
    24.                                         (
    25.                                             [category_id] => 18
    26.                                             [category_name] => категория 1.2.1
    27.                                             [parent_id] => 16
    28.                                         )
    29.  
    30.                                     [19] => Array
    31.                                         (
    32.                                             [category_id] => 19
    33.                                             [category_name] => категория 1.2.2
    34.                                             [parent_id] => 16
    35.                                         )
    36.  
    37.                                 )
    38.  
    39.                         )
    ключ к массиву достаю из GET запроса..
    как мне обратиться к конкретному массиву и вытащить из него вложенные массивы?
    два дня сижу)
     
  2. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.866
    Симпатии:
    753
    Адрес:
    Татарстан
    к конкретному массиву обращаться конкретно
    $arr[5]['childs']
     
    Иван kali нравится это.
  3. Иван kali

    Иван kali Активный пользователь

    С нами с:
    29 мар 2017
    Сообщения:
    50
    Симпатии:
    1
    вот такая функция у меня есть
    Код (Text):
    1.  
    2. function list_category($array, $category_id){
    3.     if(!$category_id) return false;
    4.      
    5.     $list_category = array();
    6.     if($array[$category_id]){
    7.      
    8.         $list_category = $array[$category_id]['childs'] ;
    9.          }
    10.  return $list_category;
    11. }
    но она только из корневых достает массивы и целиком весь вложенный массив
     
  4. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.866
    Симпатии:
    753
    Адрес:
    Татарстан
    вы спросили как обратиться к конкретному - вам ответили. Что вы хотите то конкретно? Выводить древовидное меню типа?
    почитайте насчет рекурсивных функций, тут без этого не обойтись
     
    Иван kali нравится это.
  5. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Как обращаться к многомерному массиву вам выше написали.
    Для обхода деревьев же нужна рекурсивная функция типа:
    PHP:
    1. function tree_processing($branch){
    2.     foreach($branch as $leaf){
    3.         if (is_array($leaf)){ // or if (isset($leaf['childs'])), if (isset($leaf['is_branch'])) etc
    4.             tree_processing($leaf);
    5.         } else{
    6.             //do something with items in branch...
    7.         }
    8.         //do something with any type...
    9.     }
    10.     //do something globally...
    11. }
     
    #5 Fell-x27, 30 мар 2017
    Последнее редактирование: 30 мар 2017
    ZlobnyKolob, TeslaFeo и Иван kali нравится это.
  6. Иван kali

    Иван kali Активный пользователь

    С нами с:
    29 мар 2017
    Сообщения:
    50
    Симпатии:
    1
    спасибо, сейчас почитаю..
    да, я хотел древовидное меню получить.. вернее уже получил, вывел тыря чужой кодинг. а тут решил изменить кое что и понеслось:eek:
    я тут еще потом потуплю немного, вы уж потерпите :)
     
  7. TeslaFeo

    TeslaFeo Старожил

    С нами с:
    9 мар 2016
    Сообщения:
    2.984
    Симпатии:
    759
    из разряда "я вас наверное уже достал, но вот мой вопрос..."

    ты правда веришь в то, что люди, которые сидят на этом форуме - приходят сюда "потерпеть"?
    [​IMG]
     
    Иван kali нравится это.
  8. Иван kali

    Иван kali Активный пользователь

    С нами с:
    29 мар 2017
    Сообщения:
    50
    Симпатии:
    1
    так то да, спойлер хорош..
    ну вобще думаю - для того чтобы помогать, тем, кто не соображает, надо обладать определенным терпением
    а если вам 'спойлер', то никто вроде вам не названивает на мобильный и не пишет слезных смс с криками о помощи
    я кстати, где-то тут видел раздел 'php для профи' попробуйТе там посмотреть:)
     
  9. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    В коде, который я скинул, понятно, что происходит?
     
    Иван kali нравится это.
  10. TeslaFeo

    TeslaFeo Старожил

    С нами с:
    9 мар 2016
    Сообщения:
    2.984
    Симпатии:
    759
    вот именно.
    сюда ходят не за этим, хотя от куда мне знать.

    Просто спрашивай и просто получай ответы. Ни кто тебя не терпит.
    --- Добавлено ---
    твой код, как всегда, прекрасен. :D
     
    Иван kali нравится это.
  11. Иван kali

    Иван kali Активный пользователь

    С нами с:
    29 мар 2017
    Сообщения:
    50
    Симпатии:
    1
    в общих чертах, но как ко мне применить я вобще непойму

    думаю надо как то пройтись по массиву $categories_tree и проверить есть ли во вложенных категориях, категории с ключем [childs] если нет, то выводить товары(уже выводит).. а если есть — категории.

    я уже создавал тему в php и msql, но там слишком много набросал, думаю никто не ответит. тут можно темы свои удалять?
     
    #11 Иван kali, 30 мар 2017
    Последнее редактирование: 30 мар 2017
  12. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Значит непонятно. В общих чертах можно смысл произведений Грибоедова понять. А код ты или понимаешь, или нет.

    Это функция. Она на вход принимает "ветвь дерева". То бишь массив.
    И по одному перебирает элементы этого массива.
    Если какой-то из элементов массива имеет признаки того, что он тоже ветвь, он отправляется в эту же функцию. Внутри функции происходит вызов ее же самой. Но уже для вложенной ветви. В это время предыдущая функция, само собой, "встает на паузу", пока не закончится новая. И так по кругу. Этот метод позволяет полностью обойти все дерево. Из этой функции можно делать return, а в строчке с ее вызовом сохранять ее результат в переменную. Таким образом мы можем рекурсивно собрать с дерева все, что угодно.

    Если же элемент не ветвь, мы делаем что-то, что хотим с ним сделать.
    Ну и отдельно, вне всего этого, по желанию еще какой-то код перед завершением.

    Эта функция - каркас, а не готовое решение. В текущем виде она не делает ничего, кроме рекурсивного обхода. Но из нее можно слепить что угодно.
    --- Добавлено ---
    Выглядит как сарказм. Там что-то не так?
     
    Иван kali нравится это.
  13. TeslaFeo

    TeslaFeo Старожил

    С нами с:
    9 мар 2016
    Сообщения:
    2.984
    Симпатии:
    759
    т е нет.
    тут всё довольно просто.
    Это рекурсивная функция (функция, которая вызывает саму себя)
    То, что ты называешь древовидным массивом называется "многомерный массив".
    Это значит, что элемент массива сам может быть массивом и так, теоретически, не ограниченное количество раз.

    Эта функция перебирает массив, и, если элемент массива сам является массивом, то вызывает себя же и перебирает уже вложенный массив. Если она в этом вложенном массиве встретит массив, то переберет и его. И так далее.

    Тебе осталось только дописать в эту функцию действия, которые надо проделать с элементом.

    Если что-то не понятно - спрашивай.
    --- Добавлено ---
    доля сарказма есть, но там всё так)
     
    Иван kali нравится это.
  14. Иван kali

    Иван kali Активный пользователь

    С нами с:
    29 мар 2017
    Сообщения:
    50
    Симпатии:
    1
    если бы так мануалы были написанны, как вы объясняете, уже бы все php выучили.. спасибо за ответы, пойду переваривать и пытаться что то написать. потом покажу, что ̶п̶о̶л̶у̶ч̶и̶л̶о̶с̶ь̶ не получилось ))
     
  15. TeslaFeo

    TeslaFeo Старожил

    С нами с:
    9 мар 2016
    Сообщения:
    2.984
    Симпатии:
    759
    мануальщики пальцы сломают - каждый частный случай описывать)
     
    Иван kali нравится это.
  16. alexblack

    alexblack Старожил

    С нами с:
    20 янв 2016
    Сообщения:
    640
    Симпатии:
    381
    В документации есть такая полезная штука,которую почему то мало кто читает, User Contributed Notes называется.Вот там многие моменты освещают,например здесь https://secure.php.net/manual/ru/features.file-upload.post-method.php где объясняют загрузку файлов методом POST можно узнать что если использовать все как в примере - получишь шелл на сайт.
     
    Иван kali нравится это.
  17. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Древовидный массив это древовидный массив. Дерево, наряду со одно/двусвязным списком, словарем, стэком и пр - это название конкретной структуры данных. Да, в PHP оно реализуется с помощью неоднородного массива, где некоторые элементы могут быть N-мерными. Но это специфика PHP. В других языках деревья реализуются иначе. Даже в PHP их можно реализовать иначе. Как с C#, например, где каждый узел дерева - это объект. С методами, свойствами и тд. Опционально хранящий в себе такие же узлы, предоставляющий методы для работы с ними и для выборок, тут уж как напишешь.

    Итого. То, что он назвал древовидным массивом - действительно древовидный массив. Он же "дерево". Прям каноничное. Со ссылками на ветвь-родителя и все такое.
    --- Добавлено ---
    Невнимательно читаешь. Там речь идет не о примере в мануале, а о одном из таких же комментов, где кто-то посоветовал ересь.
     
    Иван kali нравится это.
  18. alexblack

    alexblack Старожил

    С нами с:
    20 янв 2016
    Сообщения:
    640
    Симпатии:
    381
    Да,надо было перепроверить прежде чем написать, но в общем User Contributed Notes полезно читать.

    Я вспомнил почему у меня это отложилось в голове,потому что если брать чисто пример из документации,а именно:

    PHP:
    1. $uploaddir = '/var/www/uploads/';
    2. $uploadfile = $uploaddir . basename($_FILES['userfile']['name']);
    3.  
    4. echo '<pre>';
    5. if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) {
    6.     echo "Файл корректен и был успешно загружен.\n";
    7. } else {
    8.     echo "Возможная атака с помощью файловой загрузки!\n";
    9. }
    10.  
    11. echo 'Некоторая отладочная информация:';
    12. print_r($_FILES);
    13.  
    14. print "</pre>";
    То собственно шелл можно тоже достаточно легко получить
    PS:Да,знаю,что дальше идут всяческие рекомендации,но я очень часто встречал в сайтах именно такие формы без каких либо проверок.Просто люде брали этот пример и вставляли себе
     
    #18 alexblack, 30 мар 2017
    Последнее редактирование: 30 мар 2017
    Иван kali нравится это.
  19. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    На деле, сложнее, чем кажется, если в папке-файлохранилище запретить выполнение php-скриптов :)
    Еще одна из причин, почему я рекомендую новичкам ознакомиться с линухой чем раньше, тем лучше.
     
    Иван kali и alexblack нравится это.
  20. Иван kali

    Иван kali Активный пользователь

    С нами с:
    29 мар 2017
    Сообщения:
    50
    Симпатии:
    1
    вот вроде просто должно быть, а никак...
    Код (Text):
    1.  
    2. function list_category($array, $category_id) {
    3.     $branch = array();
    4.  
    5.     foreach ($array as $leaf) {
    6.         if ($leaf[$category_id['childs']]) {
    7.            
    8.             $branch[] = $leaf['childs']  ;
    9.             list_category($leaf);
    10.            
    11.         }
    12.     }
    13.  
    14.     return $branch;
    15. }
    на вход это подаю
    Код (Text):
    1.  
    2. if(isset($_GET['category'])){
    3.     $category_id = (int)$_GET['category'];
    4.     $list_category = list_category($categories_tree, $category_id);
    вывод пустой массив
     
  21. TeslaFeo

    TeslaFeo Старожил

    С нами с:
    9 мар 2016
    Сообщения:
    2.984
    Симпатии:
    759
    Ну намудрил!)))

    Скорее всего у тебя условие не выполняется на всех итерациях цикла foreach.

    Но даже если будет выполняться, то ты внутри функции передаешь функции 1 параметр, а она принимает 2.
    Кроме того, функция даже если и выполнится, то надо куда-то наверное сохранить то, что она вернет.

    И еще может быть чего-то не заметил)) У меня мозг кипит от твоего кода))

    А что сделать хочешь (подробно)?
     
    Иван kali нравится это.
  22. Иван kali

    Иван kali Активный пользователь

    С нами с:
    29 мар 2017
    Сообщения:
    50
    Симпатии:
    1
  23. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Причем второй параметр не имеет значения по умолчанию, и, следовательно, должна быть ошибка, которой нет.
    Автор, как минимум надо включить вывод ошибок на страницу.
    --- Добавлено ---
    В своей же теме на стартовое сообщение жмакаешь "пожаловаться", в тексте жалобы пишешь просьбу на удаление. И, желательно, причину для удаления. Первый же свободный модератор рассмотрит заявку.
     
    Иван kali нравится это.
  24. Иван kali

    Иван kali Активный пользователь

    С нами с:
    29 мар 2017
    Сообщения:
    50
    Симпатии:
    1
    да вроде стоит error_reporting(-1)
    на счет темы понял, но уже завтра
     
  25. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    И что это значит? А ты не знаешь, ты не читал документацию.
    PHP:
    должно быть
     
    Иван kali нравится это.