За последние 24 часа нас посетили 15774 программиста и 1666 роботов. Сейчас ищет 831 программист ...

Добавление в массив(в глубину)

Тема в разделе "PHP для новичков", создана пользователем deadlolman, 29 июл 2016.

  1. deadlolman

    deadlolman Новичок

    С нами с:
    14 июн 2016
    Сообщения:
    23
    Симпатии:
    1
    День добрый. Застрял на одной задаче. У меня есть скрипт который строит дерево каталога сайта.
    PHP:
    1. <?php
    2. foreach($arResult["SECTIONS"] as $arSection):
    3.  
    4.     $section=1;
    5.     for($i=0;$i<count($parent);$i++)
    6.     if(($arSection["ID"]==$parent[$i])||($arhiv[$arSection["ID"]]==1)) $section=0;
    7.     if($section==0 and $Manuals_ON==1 and ($arhiv[$arSection["ID"]]==1)) $section=1;
    8.    
    9.  
    10.     if(($section==1)&&(($arSection["DEPTH_LEVEL"]==1)||($section_id==$arSection["ID"])||($arParent[$section_id]==$arSection["ID"])||($section_id==$arParent[$arSection["ID"]])||($arParent[$section_id]==$arParent[$arSection["ID"]])||($arParent[$arParent[$section_id]]==$arParent[$arSection["ID"]])))
    11.  
    12.     {
    13.         $str_geo = $arGeo[$arIdBD[$arSection["ID"]]];
    14. //echo "id = ".$arIdBD[$arSection["ID"]].", str_geo=$str_geo, arSection[ID] = ".$arSection["ID"].", arSection[NAME] = ".$arSection["NAME"]."<br>";
    15.         if ((strpos($str_geo, $user_country_code) === false) and ($str_geo != "")) {
    16.         } else {
    17.             $j++;
    18.           if($CURRENT_DEPTH<$arSection["DEPTH_LEVEL"])
    19.             echo "<ul>";
    20.      
    21.           elseif($CURRENT_DEPTH>$arSection["DEPTH_LEVEL"])
    22.             echo str_repeat("</ul>", $CURRENT_DEPTH - $arSection["DEPTH_LEVEL"]);
    23.           $CURRENT_DEPTH = $arSection["DEPTH_LEVEL"];
    24.  
    25.         // Наименование подтипа продукции в зависимости от языка
    26.         $modeltype_name = $arSection["NAME"];
    27.         $cross[] = $modeltype_name;
    28.         if ($Lang == "e") $modeltype_name = $arEngNames[$arSection["ID"]];
    29.             $section_url = $arSection["SECTION_PAGE_URL"];
    30.  
    31. ?>
    32.         <li><?=$modeltype_name?></li>
    33. <?
    34.         } // if ((strpos($str_geo, $user_country_code) === false) and ($str_geo != ""))
    35.     }
    36. }    
    Дерево заполняется из переменной $modeltype_name.

    Вид дерева после отработки:
    • С системой No Frost (шириной 600 мм)
      • Full No Frost
        • Серия COMFORT+
          • ХМ 4421 N
          • ХМ 4423 N
          • ХМ 4424 N
          • ХМ 4425 N
          • ХМ 4426 N
      • Frost Free
        • Серия COMFORT+
          • ХМ 5124 F
    • Комбинированные (двухкомпрессорные с нижним расположением морозильной камеры, шириной 600 мм)
      • Серия COMFORT
        • ХМ 6319
        • ХМ 6321
        • ХМ 6323
        • ХМ 6324
        • ХМ 6325
        • ХМ 6326
      • Серия GEOMETRY
        • ХМ 6119
        • ХМ 6120
        • ХМ 6121
        • ХМ 6122
        • ХМ 6123
        • ХМ 6124
        • ХМ 6125
        • ХМ 6126
      • Серия ELEGANCE и т.д.

    И теперь собственное вопрос. Мне надо это все добавить в массив что бы сохранилась структура.
    Но возникла проблема со вложенностью, мне вот в сюда надо вставить добаление в массив
    if($CURRENT_DEPTH<$arSection["DEPTH_LEVEL"])
    echo "<ul>";

    elseif($CURRENT_DEPTH>$arSection["DEPTH_LEVEL"])
    echo str_repeat("</ul>", $CURRENT_DEPTH - $arSection["DEPTH_LEVEL"]);
    $CURRENT_DEPTH = $arSection["DEPTH_LEVEL"];

    В общем как добавлять в массив в глубину я не нашел. Намекните алгоритм. Рекурсивно не вышло. Может ключи где хранить отдельно? Или еще что? Мне нужен профит) Спасибо.
     
    #1 deadlolman, 29 июл 2016
    Последнее редактирование модератором: 1 авг 2016
  2. denis01

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

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    Чтобы создать многомерный массив, нужно у значения массива сделать значение массивом.
    Вот пример:
    PHP:
    1. <?php
    2. $arr = [
    3.   [
    4.     'this' => 'hello',
    5.     'sub' => [
    6.         'this' => 'hello sub',
    7.         'sub' => [
    8.             'this' => 'hello sub sub',
    9.         ],
    10.     ],
    11.   ],
    12. ];
     
  3. deadlolman

    deadlolman Новичок

    С нами с:
    14 июн 2016
    Сообщения:
    23
    Симпатии:
    1
    Нет, ну это понятно)) Вопрос то не как он выглядит))

    Мне нужно понянть как сделать вот так. Скрипт словами:
    PHP:
    1. Если удовлетворяет условию добавляем в массив $arr['k'] = $mass['n'];
    2. 2 итерация:
    3. $arr['k'][] = $mass['n']
    4. 3 итерация:
    5. $arr['k']['k'][] = $mass['n']
     
  4. deadlolman

    deadlolman Новичок

    С нами с:
    14 июн 2016
    Сообщения:
    23
    Симпатии:
    1
    Я так понял, никто не знает)
     
  5. denis01

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

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

    Что в $arr['k'] и $mass['n']?
     
  6. deadlolman

    deadlolman Новичок

    С нами с:
    14 июн 2016
    Сообщения:
    23
    Симпатии:
    1
    Условие в коде выше)
    $arr['k']['k'][]=$mass['n'] ---> приведены как пример.
    --- Добавлено ---
    Если кому интересно, решение моей проблемы. Сравните с дефалтом выше.Вместо SWITCH(костыля) нужно рекурсия. Не было времени, пришлось костылить.

    PHP:
    1. $CURRENT_DEPTH=$arResult["SECTION"]["DEPTH_LEVEL"]+1;
    2. //echo "Manuals_ON=$Manuals_ON, Archive_ON=$Archive_ON,<br>";
    3.  
    4. $j = 0;
    5. $array_baf = array();
    6. $array_baf2 = array();
    7. $array_baf2 = '';
    8. $baf_i=0;
    9. $lavel_op=0;
    10. $lavel_cl=0;
    11.  
    12. foreach($arResult["SECTIONS"] as $arSection):
    13.  
    14.     $section=1;
    15.  
    16.     for($i=0;$i<count($parent);$i++)
    17.     if(($arSection["ID"]==$parent[$i])||($arhiv[$arSection["ID"]]==1)) $section=0;
    18. //    if(($arhiv[$arSection["ID"]]==1) and $Manuals_ON==1) $section=1;
    19. //echo "arSec[ID]=".$arSection["ID"]."par[$i]=".$parent[$i].", arh=".$arhiv[$arSection["ID"]]."<br>";
    20.     if($section==0 and $Manuals_ON==1 and ($arhiv[$arSection["ID"]]==1)) $section=1;
    21.      
    22.  
    23.     if(($section==1)&&(($arSection["DEPTH_LEVEL"]==1)||($section_id==$arSection["ID"])||($arParent[$section_id]==$arSection["ID"])||($section_id==$arParent[$arSection["ID"]])||($arParent[$section_id]==$arParent[$arSection["ID"]])||($arParent[$arParent[$section_id]]==$arParent[$arSection["ID"]])))
    24.  
    25.     {
    26.         $str_geo = $arGeo[$arIdBD[$arSection["ID"]]];
    27. //echo "id = ".$arIdBD[$arSection["ID"]].", str_geo=$str_geo, arSection[ID] = ".$arSection["ID"].", arSection[NAME] = ".$arSection["NAME"]."<br>";
    28.         if ((strpos($str_geo, $user_country_code) === false) and ($str_geo != "")) {
    29.         } else {
    30.             $j++;
    31.  
    32.               if($CURRENT_DEPTH<$arSection["DEPTH_LEVEL"]){
    33.                   $baf_i++;
    34.                 echo $baf_i.'<ul>';
    35.                
    36.                 //$array_baf[]='ul';
    37.                 //$array_baf2 .= 'array(';
    38.                
    39.                
    40.               }
    41.               elseif($CURRENT_DEPTH>$arSection["DEPTH_LEVEL"]){
    42.                 $baf_i=$baf_i - ($CURRENT_DEPTH - $arSection["DEPTH_LEVEL"]);
    43.                 echo str_repeat("</ul>", $CURRENT_DEPTH - $arSection["DEPTH_LEVEL"]);
    44.                
    45.                 //$array_baf2 .= '),';
    46.                 //$array_baf2 = substr($array_baf2, 0, -1);
    47.                 //$array_baf[]='-ul';
    48.               }
    49.               $CURRENT_DEPTH = $arSection["DEPTH_LEVEL"];
    50.  
    51.             // Наименование подтипа продукции в зависимости от языка
    52.             $modeltype_name = $arSection["NAME"];
    53.             //$cross[] = $modeltype_name;
    54.             if ($Lang == "e") $modeltype_name = $arEngNames[$arSection["ID"]];
    55.                 $section_url = $arSection["SECTION_PAGE_URL"];
    56.         //$array_baf2 .=',['.$modeltype_name.']=>';
    57.         $array_baf2[$baf_i]=$modeltype_name;
    58.         //$array_baf[$array_baf2[$baf_i-1]][]=$modeltype_name;
    59.         switch($baf_i){
    60.             case'1':
    61.                 $array_baf[$array_baf2[0]][]=$modeltype_name;
    62.                 break;
    63.             case'2':
    64.                 $array_baf[$array_baf2[0]][$array_baf2[1]][]=$modeltype_name;
    65.                 break;
    66.             case'3':
    67.                 $array_baf[$array_baf2[0]][$array_baf2[1]][$array_baf2[2]][]=$modeltype_name;
    68.                 break;
    69.             case'4':
    70.                 $array_baf[$array_baf2[0]][$array_baf2[1]][$array_baf2[2]][$array_baf2[3]][]=$modeltype_name;
    71.                 break;
    72.         }
    73.         //$array_baf[$array_baf2[$baf_i-1]][]=$modeltype_name;
    74. ?>
    75.         <li><?=$modeltype_name?></li>
    76. <?  
    77. //$array_baf[]='li';
    78.         } // if ((strpos($str_geo, $user_country_code) === false) and ($str_geo != ""))
    79.     }
    80. endforeach;  
    81. p($array_baf);
     
  7. mkramer

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

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
  8. denis01

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

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

    deadlolman Новичок

    С нами с:
    14 июн 2016
    Сообщения:
    23
    Симпатии:
    1
    Согласен. Слався старый битрикс и тот кто этот код писал) Мне надо было из этого составить массив который бы сохранял структуру) Та еще задачка)
     
  10. denis01

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

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    Вот я написал вручную пример структуры в этом сообщении https://php.ru/forum/threads/dobavlenie-v-massiv-v-glubinu.59365/#post-478892
    ты тоже можешь показать какой хочешь получить результат, потом какой выходит и уже сможем тебе подсказать что изменить,
    просто вывалить код и даже не сделать var_export массива, то сложно будет тебе помочь