За последние 24 часа нас посетили 17589 программистов и 1669 роботов. Сейчас ищут 1570 программистов ...

Как убить определенные ветки многомерного массива по шаблону

Тема в разделе "Сделайте за меня", создана пользователем argonaut, 27 апр 2015.

  1. argonaut

    argonaut Новичок

    С нами с:
    27 апр 2015
    Сообщения:
    4
    Симпатии:
    0
    Подскажите, пожалуйста, как удалить определенные ветки массива по шаблону

    $list[Школа 11][Класс 11][Класс 11А]="54654.doc";
    $list[Школа 10][Класс 9]{Класс 9А}="56.doc";
    $list[Школа 9][Класс 3][Класс 3А]="434.doc";
    $list[Школа 9][Класс 3][Класс 3Б]="564.doc";
    $list[Школа 10][Класс 5][Класс 5Е]="454.doc";
    $list[Школа 11][Класс 5]="454.doc";

    И есть шаблон на удаление

    $list_original[Школа 9][Класс 3]=0;
    $list_original[Школа 10][Класс 5]=0;
    $list_original[Школа 11]=0;

    Как удалить в начальном списке ветки массива согласно шаблону? Массив multidimensional. "Проредить" иногда надо и начиная с первого ключа и заканчивая последним уровнем, согласно шаблону.
     
  2. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    Re: Как убить определенные ветки многомерного массива по шаб

    unset($list_original['Школа 9']['Класс 3']);
     
  3. argonaut

    argonaut Новичок

    С нами с:
    27 апр 2015
    Сообщения:
    4
    Симпатии:
    0
    Re: Как убить определенные ветки многомерного массива по шаб

    Удалить ключи нужно не в лист оригинал, а в листе. В лист ориджинал находятся образцы по которым удалять. Просто мне непонятно, как мне эти ключи с файла образца перенести для unset в файл для удаления

    Ветви массива разной длинны, нельзя предсказать как-то количество ключей, потом куда эти ключи сохранить в отдельные переменные?

    Без образца функции мне сложно понять, что нужно сделать
     
  4. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.589
    Симпатии:
    1.763
    Re: Как убить определенные ветки многомерного массива по шаб

    Называется рекурсия. В данном случае вам нужно удалить только последнее звено, или все? И можете показать на примере исходные данные, что надо удалить и как должно выглядеть после этого?
     
  5. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    Re: Как убить определенные ветки многомерного массива по шаб

    рекурсивно итерировать. если на входном ноль и на выходном есть такой путь - удалять путь.
     
  6. argonaut

    argonaut Новичок

    С нами с:
    27 апр 2015
    Сообщения:
    4
    Симпатии:
    0
    Re: Как убить определенные ветки многомерного массива по шаб

    Исходные данные находятся в моем самом первом посте. 1. Массив для обработки. 2. Массив - образец, который содержит те "ветки" многомерного массива, которые нужно удалить. Эти ветки не одинаковые. Где-то нужно удалить массив начиная со второго "по глубине" ключа, где-то надо удалить самый последний ключ. То есть где-то может понадобится удалить всю школу, а где-то только класс 3А. Что именно нужно удаляить - содержится во втором массиве. Значения 0 в конце - просто для того, чтобы сформировать сам массив. Нельзя просто взять и удалить скажем класс 3А, потому что класс 3А может принадлежать разным школам, нужно удалить именно третий класс школы номер девять. То есть удалять до той глубины, которая указана в файле образце

    А в конце должно остаться

    $list[Школа 11][Класс 11][Класс 11А]="54654.doc";
    $list[Школа 10][Класс 9]{Класс 9А}="56.doc";
    $list[Школа 9][Класс 3][Класс 3А]="434.doc";
    $list[Школа 9][Класс 3][Класс 3Б]="564.doc";
    $list[Школа 10][Класс 5][Класс 5Е]="454.doc";
    $list[Школа 11][Класс 5]="454.doc";

    И есть шаблон на удаление

    $list_original[Школа 9][Класс 3]=0;
    $list_original[Школа 10][Класс 5]=0;
    $list_original[Школа 11]=0;


    $list[Школа 10][Класс 9]{Класс 9А}="56.doc";

    потому что все остальные были удалены по шаблону

    осталась $list[Школа 9] - но у нее нет значений, только сам ключ


    Добавлено спустя 1 минуту 45 секунд:
    Re: Как убить определенные ветки многомерного массива по шаблону
    можно ли показать пример, хотя бы с одним ключом? Сложно понять суть кода, опыт у меня очень небольшой
     
  7. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    Код (PHP):
    1. <?php
    2. ////////////////////////////////////////////////////////////////////////////////
    3. // ИСХОДНОЕ ДЕРЕВО И ЕГО СУДЬБА
    4.  
    5. // удаляется третьим правилом от школы и ниже
    6. $list['Школа 11']['Класс 11']['Класс 11А']="54654.doc";
    7. // остается
    8. $list['Школа 10']['Класс 9']['Класс 9А']="56.doc";
    9. // удаляется первым правилом от класса и ниже
    10. $list['Школа 9']['Класс 3']['Класс 3А']="434.doc";
    11. // удаляется первым правилом от класса и ниже
    12. $list['Школа 9']['Класс 3']['Класс 3Б']="564.doc";
    13. // ветка Школы 9 также удаляется ибо опустевает
    14.  
    15. // удаляется вторым правилом от класса и ниже
    16. $list['Школа 10']['Класс 5']['Класс 5Е']="454.doc";
    17.  
    18. // удаляется третьим правилом от школы и ниже
    19. $list['Школа 11']['Класс 5']="454.doc";
    20.  
    21.  
    22. ////////////////////////////////////////////////////////////////////////////////
    23. // МОДИФИКАТОР ДЕРЕВА
    24.  
    25. // удаляет 3 и 4 строки а так же удаляет всю Школу9 ибо в ней не остается записей
    26. $list_original['Школа 9']['Класс 3']=0;
    27. // удаляет строку 5
    28. $list_original['Школа 10']['Класс 5']=0;
    29. // удаляется строки 1 и 6 то есть всю Школу11
    30. $list_original['Школа 11']=0;
    31.  
    32.  
    33. ////////////////////////////////////////////////////////////////////////////////
    34. // НА ВЫХОДЕ ОЖИДАЕМ
    35.  
    36. // $list['Школа 10']['Класс 9']['Класс 9А']="56.doc";
    37.  
    38.  
    39. ////////////////////////////////////////////////////////////////////////////////
    40. // ФУНКЦИЯ
    41.  
    42. // один обязательный аргумент для циклического уничтожения пустых веток
    43. // один необязательный аргумент для изначального слияния исходного дерева и дровосеков
    44. function cut ($input, $cutter = null) {
    45.     // если дан второй массив
    46.     if (is_array($cutter)) {
    47.         // заменяем все элементы первого массива соответствующими элементами второго массива
    48.         $input = array_replace_recursive($input, $cutter);
    49.     }
    50.     
    51.     // итерируем текущую ветку дерева
    52.     foreach ($input as $k => &$value) {
    53.         // у нас тут массив
    54.         if (is_array($value)) {
    55.             // изучим его рекурсивным вызовом
    56.             $value = cut($value);
    57.         }
    58.         
    59.         // если в итоге у нас пустое значение (ноль или пустой массив)...
    60.         if (empty($value)) {
    61.             // удалим такой ключ из текущей ветки
    62.             unset($input[$k]);
    63.         }
    64.     }
    65.     
    66.     // вернем результат работы
    67.     return $input;
    68.     
    69. }
    70.  
    71. ////////////////////////////////////////////////////////////////////////////////
    72. // ЗАПУСК И РЕЗУЛЬТАТЫ
    73.  
    74. print_r(cut($list, $list_original));
    75.  
    76. /*
    77. Array
    78. (
    79.     [Школа 10] => Array
    80.         (
    81.             [Класс 9] => Array
    82.                 (
    83.                     [Класс 9А] => 56.doc
    84.                 )
    85.  
    86.         )
    87.  
    88. )
    89. */
    90.  
    91. // ЭТО ОЖИДАННЫЙ РЕЗУЛЬТАТ В РАМКАХ ПРЕДОСТАВЛЕННЫХ ВХОДНЫХ ДАННЫХ
    92.  
    93. ////////////////////////////////////////////////////////////////////////////////
    94. // БРОСАЙ ПРОГРАММИРОВАНИЕ - ТЫ НЕ ВИДИШЬ АЛГОРИТМОВ.     
    Добавлено спустя 1 минуту 34 секунды:
    Re: Как убить определенные ветки многомерного массива по шаблону
    Сурикат, перенеси плиз тред в ветку для ленивых - тут ноль рвения у человека вощемта
     
  8. Fell-x27

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

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.770
    Адрес:
    :сердА
    Re: Как убить определенные ветки многомерного массива по шаб

    Грустно.
    Сессия щас чтоль, или чего там еще может быть? Сыпятся прям горстями с академическими задачками, при нулевом скиле и таком же понимании происходящего.

    Done.
     
  9. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    Re: Как убить определенные ветки многомерного массива по шаб

    ну похоже да. была бы хотя бы какая-то попытка. а то дай и всё тут.
    мерси
     
  10. argonaut

    argonaut Новичок

    С нами с:
    27 апр 2015
    Сообщения:
    4
    Симпатии:
    0
    Re: Как убить определенные ветки многомерного массива по шаб

    Благодарю за помощь, Ганзал! Я взял функцию поиска и удаления значения массива вызовом самой себя и переделал ее под удаления ключа массива, вроде тоже работает.

    Всего тебе наилучшего!