Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > PHP
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.07.2017, 08:53   #1
bush007
Форумчанин
 
Аватар для bush007
 
Регистрация: 10.02.2009
Сообщений: 226
По умолчанию создать массив и разобрать его

Здравствуйте.
Есть конфигурационный файл коммутатора в текстовом файле (бекап конфига).
т.к. конфиг большого размера - хочу вытащить из него номера вланов и их названия, + номера портов куда они прописаны.
бекап имеет вид типа:
Код:
; Product Name = MGS-3712F
; Firmware Version = V3.90(BBB.0) | 10/17/2008
; SysConf Engine Version = 1.2
vlan 1 
  name 1 
  normal "" 
  fixed 1-12 
  forbidden "" 
  untagged 1-12 
exit
vlan 51 
  name my vlan 
  normal "" 
  fixed 1-4,8,12 
  forbidden 5-7,9-11 
  untagged 5-7,9-11 
exit
вывожу на экран массив:
Код:
$content = file('test.log');
print_r($array);
выводит типа того:
Код:
Array ( [0] => ; Product Name = MGS-3712F [1] => ; Firmware Version = V3.90(BBB.0) | 10/17/2008 [2] => ; SysConf Engine Version = 1.2 [3] => vlan 1 [4] => name 1 [5] => normal "" [6] => fixed 1-12 [7] => forbidden "" [8] => untagged 1-12 [9] => exit [10] => vlan 51 [11] => name my vlan [12] => normal "" [13] => fixed 1-4,8,12 [14] => forbidden 5-7,9-11 [15] => untagged 5-7,9-11 [16] =>
и тут я застрял, не могу сообразить каким образом мне вытащить необходимую информацию.

Я понимаю, что надо разбивать массив на вложенные масивы по ключевому слову, но как это сделать?

Если время позволяет вам, покажите кусочек кода для этого.
Т.е. пробежать до конца файл, каждую секцию с описанием влана внести в свой массив типа влан-> имя-> порт-> и уже работать с этими данными.
следи за собой. Будь осторожен.
Не забывай свой первый "hello world".
bush007 вне форума Ответить с цитированием
Старый 24.07.2017, 10:12   #2
Andkorol
Старожил
 
Регистрация: 31.05.2010
Сообщений: 3,301
По умолчанию

PHP код:
$content file('test.log'); // считываем файл в массив построчно
$vlans = array(); // результирующий массив данных по vlan
$current_vlan ''// текущий vlan

if(!empty($content)){
    foreach (
$content as $row) { // проходим по массиву (по строкам файла test.log)
        
$row trim($row); // удаляем лишние пробелы, переносы строк и табуляции
        
if(strpos($row'vlan ') !== false){ // если строка содержит ключевую фразу 'vlan '
            
$current_vlan $row// фиксируем строку в качестке ключа для текущего vlan
            
$vlans[$current_vlan] = array(); // определяем массив для данных по этому vlan
        
}
        elseif(!empty(
$current_vlan) && ($row !== 'exit')){ // или же если уже есть ключ текущего vlan + строка не является словом 'exit'
            
$row_exploded explode(' '$row); // разбиваем строку по пробелу – чтоб выделить ключ для строки данных
            
$row_key array_shift($row_exploded); // первый элемент массива – это ключ
            
$vlans[$current_vlan][$row_key] = implode(' '$row_exploded); // собираем данные в результирующий массив
        
}
    }
}

var_dump($vlans); 
Результат:
Код:
array (size=2)
  'vlan 1' => 
    array (size=5)
      'name' => string '1' (length=1)
      'normal' => string '""' (length=2)
      'fixed' => string '1-12' (length=4)
      'forbidden' => string '""' (length=2)
      'untagged' => string '1-12' (length=4)
  'vlan 51' => 
    array (size=5)
      'name' => string 'my vlan' (length=7)
      'normal' => string '""' (length=2)
      'fixed' => string '1-4,8,12' (length=8)
      'forbidden' => string '5-7,9-11' (length=8)
      'untagged' => string '5-7,9-11' (length=8)
Andkorol вне форума Ответить с цитированием
Старый 24.07.2017, 13:21   #3
bush007
Форумчанин
 
Аватар для bush007
 
Регистрация: 10.02.2009
Сообщений: 226
По умолчанию

Вы как всегда помогаете, спасибо огромное!
А каким образом я могу обратиться к значению последнего массива?
(например в данном случае к влану 51?)
следи за собой. Будь осторожен.
Не забывай свой первый "hello world".
bush007 вне форума Ответить с цитированием
Старый 24.07.2017, 15:49   #4
Andkorol
Старожил
 
Регистрация: 31.05.2010
Сообщений: 3,301
По умолчанию

Цитата:
Сообщение от bush007 Посмотреть сообщение
А каким образом я могу обратиться к значению последнего массива?
(например в данном случае к влану 51?)
Зная явно ключ последнего элемента:
$vlans['vlan 51']['name'] и т.д.
Не зная явно ключ последнего элемента:
$last_vlan = end($vlans);
$last_vlan['name'] и т.д.
Andkorol вне форума Ответить с цитированием
Старый 25.07.2017, 08:54   #5
bush007
Форумчанин
 
Аватар для bush007
 
Регистрация: 10.02.2009
Сообщений: 226
По умолчанию

я пробую вывести значения массива так:
Код:
$vlans[$current_vlan] = array(); // определяем массив для данных по этому vlan
			$name = $vlans[$current_vlan]['name'];
			$normal = $vlans[$current_vlan]['normal'];
			$fixed = $vlans[$current_vlan]['fixed'];
			$forbidden = $vlans[$current_vlan]['forbidden'];
			$untagged = $vlans[$current_vlan]['untagged'];	

echo "$current_vlan , name : $name, normal: $normal,";
и ничего не получаю:
Код:
vlan 1vlan 51vlan 53vlan 76vlan 76 : name : ,normal: ,
что я делаю не так?
следи за собой. Будь осторожен.
Не забывай свой первый "hello world".
bush007 вне форума Ответить с цитированием
Старый 25.07.2017, 10:20   #6
Andkorol
Старожил
 
Регистрация: 31.05.2010
Сообщений: 3,301
По умолчанию

Результатом работы моего кода является массив, который имеет структуру, представленную в моём сообщении выше.
Для вывода информации из этого массива нужно уже после моего кода выполнить:
PHP код:
foreach ($vlans as $vlan_key => $vlan) {
    echo 
"{$vlan_key}, name : {$vlan['name']}, normal: {$vlan['normal']}<br/>";

В браузер будет выведена такая информация:
vlan 1, name : 1, normal: ""
vlan 51, name : my vlan, normal: ""
Andkorol вне форума Ответить с цитированием
Старый 25.07.2017, 12:39   #7
bush007
Форумчанин
 
Аватар для bush007
 
Регистрация: 10.02.2009
Сообщений: 226
По умолчанию

О! Спасибо!
следи за собой. Будь осторожен.
Не забывай свой первый "hello world".
bush007 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Разобрать массив Predator199 JavaScript, Ajax 9 13.06.2014 19:59
Требуется создать ступенчатый массив и заполнить его из файла N0ir Помощь студентам 0 17.06.2013 13:20
Создать функцию Max, которая находит в заданном целочисленном массиве максимальный элемень и возвращает его. массив передается в к devs Помощь студентам 2 21.12.2011 11:40
URL надо разобрать в массив best island Общие вопросы .NET 2 18.08.2010 10:20
Создать массив целых чисел и записать его в файл Desvi Паскаль, Turbo Pascal, PascalABC.NET 3 07.06.2010 19:04