2

我已经尝试了很多次将此配置文件转换为多维数组,这意味着我必须读取 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
4

3 回答 3

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')

大批
(
    [id] => www
    [会话] => 数组
        (
            [超时] => 120
            [服务器] => 数组
                (
                    [0] => 数组
                        (
                            [主机] => 127.0.0.1
                            [端口] => 1111
                            [id] => session1
                        )

                    [1] => 数组
                        (
                            [主机] => 127.0.0.1
                            [端口] => 1111
                            [id] => session2
                        )

                )

        )

    [图像] => 数组
        (
            [宽度] => 640
            [身高] => 480
            [水印] => 数组
                (
                    [小] => wsmall.png
                    [正常] => wnormal.png
                )

        )

)
于 2012-07-25T18:38:11.907 回答
1

像这样的东西应该工作:

$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);
}

在一次读完每一行之后,你可以通过-ing on将所有的键$keys和值放入。然后,作为指向数组的“指针”,我循环遍历所有由-ing on单独提取的,以形成多维数组。一旦所有的键都用完,我将值分配给该条目,然后移至下一行。$valueexplode()=$temp$config$keysexplode().

您可以在演示中看到它运行良好。对于您的输入,这将产生一个像这样的数组:

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"
    }
  }
}
于 2012-07-25T18:31:41.663 回答
1

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

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

  • Zend/Config.php
  • Zend/Config/Ini.php
  • Zend/Config/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中。

于 2012-07-25T18:39:37.583 回答