Проблема навигации в многомерном массиве

Фанат

oncle terrible
Команда форума
Смотрю я на эту тему и понимаю, что у чувака железное терпение и что форум можно в принципе закрыть совсем, повесив вместо него анекдот про туалетную бумагу.
 

AnrDaemon

Продвинутый новичок
@Фанат, я честно потратил два часа на написание такого парсера.
На каждом шаге у меня появлялось больше и больше вопросов.
Два глобальных: (отставим вопрос "что это за [цензура] и кому это может пригодиться?" в сторону…)
1. Отступы неконсистентны. Где-то два пробела, где-то один. Как отслеживать структуру? Считать любое уменьшение отступа ресетом в корень или считать по ширине?
2. Что считать ключами? По примеру вроде последнее слово - значение, либо это ключ-массив, но что делать с "output_buffering 1"/"output_buffering 2" ? Там получается и значение и массив разом.
 

antson

Новичок
Партнер клуба
тут еще вопрос может быть. Лог точно пишется атомарно ? А то если несколько процессов начнут писать например через строчку ?
 

Фанат

oncle terrible
Команда форума
@Фанат, я честно потратил два часа на написание такого парсера.
На каждом шаге у меня появлялось больше и больше вопросов.
Ну вот такой ответ был бы по-человечески.
А не те ремарки, которые ты цедил сквозь зубы на прошлой странице.
 

AnrDaemon

Продвинутый новичок
Да когда я вижу подобные задания, убивать хочется тех, кто их даёт…
И ведь дают новичкам, которые не в состоянии осознать безнадёжность ситуации и не могут аргументировать причины провала.
 

Metroplex

Новичок
@AnrDaemon,

исходный конфиг я упростил, вот оригинал и он намного хуже:
Код:
!
! OpenBSC (UNKNOWN) configuration saved from vty
!!
password foo
!
log stderr
  logging filter all 1
  logging color 1
  logging print category 0
  logging timestamp 0
  logging level all everything
  logging level rll everything
  logging level cc everything
  logging level mm everything
  logging level rr everything
  logging level rsl everything
  logging level nm everything
  logging level mncc notice
  logging level pag notice
  logging level meas notice
  logging level sccp notice
  logging level msc notice
  logging level mgcp notice
  logging level ho notice
  logging level db notice
  logging level ref notice
  logging level gprs debug
  logging level ns info
  logging level bssgp debug
  logging level llc debug
  logging level sndcp debug
  logging level nat notice
  logging level ctrl notice
  logging level smpp debug
  logging level filter debug
  logging level lglobal notice
  logging level llapd notice
  logging level linp notice
  logging level lmux notice
  logging level lmi notice
  logging level lmib notice
  logging level lsms notice
  logging level lctrl notice
  logging level lgtp notice
!
line vty
 no login
!
e1_input
 e1_line 0 driver ipa
 e1_line 0 port 0
 no e1_line 0 keepalive
network
 network country code 250
 mobile network code 77
 short name AYtest
 long name AYtest
 auth policy accept-all
 location updating reject cause 13
 encryption a5 1
 neci 1
 paging any use tch 0
 rrlp mode none
 mm info 1
 handover 0
 handover window rxlev averaging 10
 handover window rxqual averaging 1
 handover window rxlev neighbor averaging 10
 handover power budget interval 6
 handover power budget hysteresis 3
 handover maximum distance 9999
 timer t3101 10
 timer t3103 0
 timer t3105 0
 timer t3107 0
 timer t3109 4
 timer t3111 0
 timer t3113 60
 timer t3115 0
 timer t3117 0
 timer t3119 0
 timer t3122 10
 timer t3141 0
 dtx-used 0
 subscriber-keep-in-ram 0
 extension-prefix 0
 bts 0
  type sysmobts
  band GSM900
  cell_identity 0
  location_area_code 1
  base_station_id_code 63
  ms max power 10
  cell reselection hysteresis 4
  rxlev access min 0
  periodic location update 30
  radio-link-timeout 32
  channel allocator ascending
  rach tx integer 9
  rach max transmission 7
  channel-descrption attach 1
  channel-descrption bs-pa-mfrms 5
  channel-descrption bs-ag-blks-res 1
  ip.access unit_id 1801 0
  oml ip.access stream_id 255 line 0
  neighbor-list mode automatic
  codec-support fr
  gprs mode none
  no force-combined-si
  trx 0
   rf_locked 0
   arfcn 990
   nominal power 35
   max_power_red 14
   rsl e1 tei 0
    timeslot 0
     phys_chan_config CCCH+SDCCH4
     hopping enabled 0
    timeslot 1
     phys_chan_config SDCCH8
     hopping enabled 0
    timeslot 2
     phys_chan_config TCH/F
     hopping enabled 0
    timeslot 3
     phys_chan_config TCH/F
     hopping enabled 0
    timeslot 4
     phys_chan_config TCH/F
     hopping enabled 0
    timeslot 5
     phys_chan_config TCH/F
     hopping enabled 0
    timeslot 6
     phys_chan_config TCH/F
     hopping enabled 0
    timeslot 7
     phys_chan_config TCH/F
     hopping enabled 0
  trx 1
   rf_locked 0
   arfcn 980
   nominal power 35
   max_power_red 14
   rsl e1 tei 0
    timeslot 0
     phys_chan_config TCH/F
     hopping enabled 0
    timeslot 1
     phys_chan_config TCH/F
     hopping enabled 0
    timeslot 2
     phys_chan_config TCH/F
     hopping enabled 0
    timeslot 3
     phys_chan_config TCH/F
     hopping enabled 0
    timeslot 4
     phys_chan_config TCH/F
     hopping enabled 0
    timeslot 5
     phys_chan_config TCH/F
     hopping enabled 0
    timeslot 6
     phys_chan_config TCH/F
     hopping enabled 0
    timeslot 7
     phys_chan_config TCH/F
     hopping enabled 0
mncc-int
nitb
 subscriber-create-on-demand
smpp
 local-tcp-port 2775
 policy closed
 no smpp-first
Привожу, так как обратной связи от тех кто выдал это, я не получил. Две с половиной недели ушло на топорное решение, многовато, конечно.
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
Стою на асфальте я в лыжи обутый. То ли лыжи не едут, то ли у @AnrDaemon ПМС. А может, годы на этом форуме сказываются.
Нормальный рабочий вопрос, просто конфиг, очевидный ответ, выходящий из области натягивания верстки на Drupal. Обычное бинарное дерево. Решается влоб. Обычные для девушек тараканы в голове у ТС.

PHP:
$rows = file($filename)  - вернет массив строк.
$level=0;
$root = new ArrayObject();
$root->parent = NULL;
$root->children=[];
foreach($rows as $r)
  проверка на то, что $r не надо пропустить
  $new_level = (int)strspn($r,' '); - считает отступы
  if ($new_level>$level) {
  пусть на следующей строке может больше быть только на 1 пробел,
  иначе в $root надо записывать количество, а при выходе наверх учитывать это
    $child = new ArrayObject();
    $child->parent = $root;
    $root->children[] = $child;
    $root = $child;
    $level=$new_level;
  }elseif($new_level<$level){
      for($level - $new_level)
         if ($root->parent !== NULL)  ...
              $root =$root->parent;  - возврат на нужный уровень
      $level=$new_level;
   }
   // если уровень тот же - просто добавляем лист в узел
   $root[] = explode(trim($r),''); -- вероятно, нужен другой парсер строки формата "key value"
}
дальше надо отформатировать вывод $root в нужном формате
В связи с тем, что в узлах есть аттрибуты, к формату ['key'=>['subkey'=>'value']] не приводится, а приводится к DOM-структуре, как HTML.

2. Где не сходится - идем и тыкаем носом того, кто писал запись в таком формате

Вопросы?
 
Последнее редактирование:
  • Like
Реакции: AmdY

Фанат

oncle terrible
Команда форума
Да при чем здесь обиделся. Эта реплика совсем мимо кассы.
Просто указал на весьма распространенный и весьма дурацкий подход, когда вместо реальных условий задачи автор приводит наскоро нашкрябаный черновик, люди тратят свое время, а он в итоге получает нерабочее решение.
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
да я эту ветку до вчерашнего дня не читал
а ты мог бы решить задачу недели на 2 раньше
 
Последнее редактирование:

Metroplex

Новичок
Я всегда прихожу в восторг от таких фраз ) Две с половиной недели парсить конфиг....
Приятно, что вас так легко привести в восторг)

@grigori, мог бы, если бы кто-нибудь скинул пример дерева. В инете с этим туговато. Спасибо за код.

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

Metroplex

Новичок
Вот какой смысл спорить с человеком, который заранее заявил, что никаких аргументов не примет и вообще всё лучше тебя знает?…
Вы получаете какое-то сомнительное удовольствие от общения в этой ветке, дорогой @AnrDaemon ? Зачем вы тратите свое время?
 

Фанат

oncle terrible
Команда форума
Ладно тут уже не техническое обсуждение пошло.
Давайте его закруглим.
 
Сверху