将配置(文本文件)转换为多维数组

时间:2012-07-25 18:23:41

标签: php arrays multidimensional-array

我已经尝试过很多次将这个配置文件转换为多维数组,这意味着我必须读取config.txt文件,然后我必须转换为多维数组。我需要帮助或一些建议。

config.txt的:

id=www
session.timeout=120

session.server.0.host=127.0.0.1

session.server.0.port=1111

session.server.0.id=session1

session.server.1.host=127.0.0.1

session.server.1.port=1111

session.server.1.id=session2

image.width=640 

image.height=480 

image.watermark.small=wsmall.png 

image.watermark.normal=wnormal.png

3 个答案:

答案 0 :(得分:2)

这样的事情应该有效:

$config = array();
foreach( file( 'config.txt') as $line) {
    list( $keys, $value) = explode( '=', $line);

    $temp =& $config;
    foreach( explode( '.', $keys) as $key)
    {           
        $temp =& $temp[$key];
    }
    $temp = trim( $value);
}

一次阅读每一行后,您将$keys中的所有密钥和$value中的explode() - =的{​​{1}}。然后,使用$temp作为$config数组的“指针”,循环遍历所有$keysexplode()分别由.提取{{1} ,形成多维数组。一旦所有键都用完了,我就将值分配给该条目,然后移到下一行。

你可以在the demo看到它很好用。对于您的输入,这将生成如下数组:

array(3) {
  ["id"]=>
  string(3) "www"
  ["session"]=>
  array(2) {
    ["timeout"]=>
    string(3) "120"
    ["server"]=>
    array(2) {
      [0]=>
      array(3) {
        ["host"]=>
        string(9) "127.0.0.1"
        ["port"]=>
        string(4) "1111"
        ["id"]=>
        string(8) "session1"
      }
      [1]=>
      array(3) {
        ["host"]=>
        string(9) "127.0.0.1"
        ["port"]=>
        string(4) "1111"
        ["id"]=>
        string(8) "session2"
      }
    }
  }
  ["image"]=>
  array(3) {
    ["width"]=>
    string(3) "640"
    ["height"]=>
    string(3) "480"
    ["watermark"]=>
    array(2) {
      ["small"]=>
      string(10) "wsmall.png"
      ["normal"]=>
      &string(11) "wnormal.png"
    }
  }
}

答案 1 :(得分:1)

function load_config_file($filename)
{
    $config = array();

    foreach(file($filename, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES) as $line)
    {
        if(!preg_match('/^(.+?)=(.*)$/', $line, $matches))
        {
            continue;
        }
        $indices = explode('.', $matches[1]);
        $current = &$config;
        foreach($indices as $index)
        {
            $current = &$current[$index];
        }
        $current = $matches[2];
    }

    return $config;
}

load_config_file('config.txt')的结果:

Array
(
    [id] => www
    [session] => Array
        (
            [timeout] => 120
            [server] => Array
                (
                    [0] => Array
                        (
                            [host] => 127.0.0.1
                            [port] => 1111
                            [id] => session1
                        )

                    [1] => Array
                        (
                            [host] => 127.0.0.1
                            [port] => 1111
                            [id] => session2
                        )

                )

        )

    [image] => Array
        (
            [width] => 640
            [height] => 480
            [watermark] => Array
                (
                    [small] => wsmall.png
                    [normal] => wnormal.png
                )

        )

)

答案 2 :(得分:1)

Zend Framework有一个名为Zend_Config_Ini的类,它会将此结构的文件解析为对象或数组。

要使用它,您需要从Zend Framework库中获取3个文件:

  • 的Zend / CONFIG.PHP
  • 的Zend /配置/ Ini.php
  • 的Zend /配置/ Exception.php

获得这3个文件后,这里的代码演示了解析和访问该文件中的值:

require_once 'Zend/Config/Ini.php';

$ini = new Zend_Config_Ini('settings.ini');
$ini = $ini->toArray();

echo $ini['session']['server'][0]['host']; // 127.0.0.1
echo $ini['session']['server'][1]['id'];   // session2
echo $ini['image']['width'];               // 640

要从Zend Framework获取3个文件,请将它们放在一个名为Zend的文件夹中,并附上您的PHP文件,并将Zend所在的目录添加到include_path。< / p>