Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Конфигурационный файл в массив
 
 автор: maksi_77   (18.08.2011 в 02:05)   письмо автору
1.4 Кб
 
 

Есть конфигурационный файл (прикреплен к теме). Нужно его обработать и преобразовать в массив такого вида:

  Array
(
    [path] => Array
        (
            [plugins] => plugins
            [cache] => cache
            [comments] => comments
        )
 
    [cache] => Array
        (
            [enable] => 1
            [expiration] => 86400
        )
 
    [distribute] => Array
        (
            [http://autoselect] => auto
        )
 
    [validation] => Array
        (
            [valid_chars] => abcdefghijklmnopqrstuvwxyz-01234567890
            [valid_first_char] => abcdefghijklmnopqrstuvwxyz012345678 90
            [min_chars] => 1
            [max_chars] => 63
            [name_like] => 
            [answer_like] => 
        )
 
    [comments] => Array
        (
            [string_like] => Array
                (
                    [0] => /^%/
                    [1] => /^;/
                )
 
            [text_eq_file] => 
        )
 
    [analyse] => Array
        (
            [free_like] => Array
                (
                    [0] => /domain is free/im
                )
 
            [ordered_like] => Array
                (
                    [0] => /domain is registered/im
                )
 
            [expiration_rules] => Array
                (
                    [abc] => [\t\n\r ]+\n[\t\n\r ]+
                    [def] => [\t\n\r ]+\n[\t\n\r ]+
                    [5] => [\t\n\r ]+\n[\t\n\r ]+
                    [6] => [\t\n\r ]+\n[\t\n\r ]+
                    [7] => [\t\n\r ]+\n[\t\n\r ]+
                )
 
        )
 
)



Вот что у меня получилось:

<?php
// Переносим данные из файла в массив
$mass1 file("test.conf");
// Создаем новый массив (mass2) без пустых значение и комментариев
foreach ($mass1 as $index => $val
{
    if (
$val[0] !== ";" and trim($val) !== "")
        
$mass2[] = $val;
}

// Обходим массив и создаем 2 массив (mass3) 
for($i=0$i count ($mass2); $i++)
{
    
$element $mass2[$i];
    if(
$element[0] == "["
        
$temp substr($element1strlen($element)-4);
    else 
    {
        
$ex_element explode(" = "$element);
        
$mass3[$temp][$ex_element[0]] = $ex_element[1];
    }
}

// Выводим полученный массив
print_r($mass3);
?>


Помогите мне доработать скрипт, чтобы он работал "Правильно". Заранее большое спасибо!

P.S. Функцию Parse_ini_file не предлагать!

  Ответить  
 
 автор: cheops   (18.08.2011 в 10:46)   письмо автору
 
   для: maksi_77   (18.08.2011 в 02:05)
 

В чем заключается "неправильность" работы существующего скрипта (куда копать)?

  Ответить  
 
 автор: maksi_77   (18.08.2011 в 11:20)   письмо автору
 
   для: cheops   (18.08.2011 в 10:46)
 

Вот какой массив он создает:

Array 
(
    [path] => Array 
        ( 
            [plugins] => plugins 
            [cache] => cache 
            [comments] => comments 
         ) 
    [cache] => Array 
        ( 
            [enable] => yes 
            [expiration] => 86400 
        ) 
    [distribute] => Array 
        ( 
            [http://autoselect] => auto 
        ) 
    [validation] => Array 
        ( 
            [valid_chars] => "abcdefghijklmnopqrstuvwxyz-0123456789" 
            [valid_first_char] => "abcdefghijklmnopqrstuvwxyz012345678 9" 
            [min_chars] => 1 
            [max_chars] => 63
            [name_like] => 
            [answer_like] => 
         ) 
    [comments] => Array 
        ( 
            [string_like [] ] => "/^%/" 
            [string_like[]] => "/^;/" 
            [text_eq_file] => 
         ) 
   [analyse] => Array 
           ( 
            [free_like[]] => "/domain is free/im" 
            [ordered_like[]] => "/domain is
            [expiration_rules[abc]] => "[\t\n\r ]+\n[\t\n\r ]+"
            [expiration_rules[def]] => "[\t\n\r ]+\n[\t\n\r ]+" 
            [expiration_rules[5]] => "[\t\n\r ]+\n[\t\n\r ]+"
            [expiration_rules[]] => "[\t\n\r ]+\n[\t\n\r ]+" )
        ) 


а нужен такой

  Array 

    [path] => Array 
        ( 
            [plugins] => plugins 
            [cache] => cache 
            [comments] => comments 
        ) 
  
    [cache] => Array 
        ( 
            [enable] => 1 
            [expiration] => 86400 
        ) 
  
    [distribute] => Array 
        ( 
            [http://autoselect] => auto 
        ) 
  
    [validation] => Array 
        ( 
            [valid_chars] => abcdefghijklmnopqrstuvwxyz-01234567890 
            [valid_first_char] => abcdefghijklmnopqrstuvwxyz012345678 90 
            [min_chars] => 1 
            [max_chars] => 63 
            [name_like] =>  
            [answer_like] =>  
        ) 
  
    [comments] => Array 
        ( 
            [string_like] => Array 
                ( 
                    [0] => /^%/ 
                    [1] => /^;/ 
                ) 
  
            [text_eq_file] =>  
        ) 
  
    [analyse] => Array 
        ( 
            [free_like] => Array 
                ( 
                    [0] => /domain is free/im 
                ) 
  
            [ordered_like] => Array 
                ( 
                    [0] => /domain is registered/im 
                ) 
  
            [expiration_rules] => Array 
                ( 
                    [abc] => [\t\n\r ]+\n[\t\n\r ]+ 
                    [def] => [\t\n\r ]+\n[\t\n\r ]+ 
                    [5] => [\t\n\r ]+\n[\t\n\r ]+ 
                    [6] => [\t\n\r ]+\n[\t\n\r ]+ 
                    [7] => [\t\n\r ]+\n[\t\n\r ]+ 
                ) 
  
        ) 
  



  Ответить  
 
 автор: cheops   (18.08.2011 в 12:11)   письмо автору
 
   для: maksi_77   (18.08.2011 в 02:05)
 

Можно начать отталкиваться от следующего решения
<?php 
  
// Переносим данные из файла в массив 
  
$mass1 file("test.conf"); 
  
// Создаем новый массив (mass2) без пустых значение и комментариев 
  
foreach ($mass1 as $index => $val)  
  { 
    if (
$val[0] !== ";" and trim($val) !== ""
        
$mass2[] = $val
  } 

  
// Обходим массив и создаем 2 массив (mass3)  
  
$section "|^\[(.*?)\]$|";
  
$pattern "|\[(.*?)\]|";
  
$temp "";
  for(
$i=0$i count ($mass2); $i++) 
  { 
    
$element trim($mass2[$i]);
    
    if(
preg_match($section$element$sec))
    {
      
// Имеем дело с секцией [xxx]
      
$temp $sec[1];
    }
    else
    {
      
// Ключ-значение
      
list($key$value) = explode("="$element); 
      
// Избавляемся от ведущих и конечных пробелов
      
$key trim($key);
      
$value trim($value);
      
// Многомерный массив
      
if(preg_match($pattern$key$out))
      {
        
// Удаляем из ключа последовательность вида [xxx]
        
$key trim(preg_replace($pattern""$key));
        
// Имеется ассоциативный ключ
        
if(!empty($out[1])) $mass3[$temp][$key][$out[1]] = $value;
        
// Назначить индексный ключ
        
else $mass3[$temp][$key][] = $value;
      }
      
// Значение как есть
      
else
      {
        
$mass3[$temp][$key] = $value
      }
    }
  } 

  
// Выводим полученный массив 
  
echo "<pre>";
  
print_r($mass3); 
  echo 
"</pre>";
?>

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования