0

我有一个数组来存储这样的配置

$config = array (
            'db' => array(
                'db1' => array(
                    'dbname' => 'mydatabase', 
                    'user' => 'myusername', 
                    'pass' => 'mypassword', 
                    'host' => 'myhost'
                )
            ),
            'url' => array(
                'homeUrl' => 'http://www.example.com'
            )
         )

我正在编写一个函数来通过传入一个字符串从数组中检索数据db.db1.dbname,它应该给我'mydatabase'

我试图将字符串分解成一个数组以获取密钥,db, db1, and dbname. 但在那之后,我有点坚持我应该如何使用它们,$config -> db -> db1 -> dbname或者$config['db']['db1']['dbname']为了得到'mydatabase'.

理想情况下,假设我有一个名为 的函数read($arg, $array),我想检索这样的结果

read('db.db1.dbname', $config), returns 'mydatabase'
read('url.homeUrl', $config), returns 'http://www.example.com'

由于我不知道字符串中包含多少个键,因此我需要它更加动态。提前致谢

4

5 回答 5

5

我认为您正在考虑 JSON

尝试$config['db']['db1']['dbname'];

于 2012-08-20T22:36:32.247 回答
4

我真的很想知道你为什么要这样做,但它是这样的:

function read($item, $config)
{
    $selectors = explode('.', $item);

    $configItem = $config;
    foreach($selectors as $selector) {
        $configItem = $configItem[$selector];
    }

    return $configItem;
}

$config = array (
    'db' => array(
        'db1' => array(
            'dbname' => 'mydatabase', 
            'user' => 'myusername', 
            'pass' => 'mypassword', 
            'host' => 'myhost',
        ),
    ),
    'url' => array(
        'homeUrl' => 'http://www.example.com',
    ),
);

read('db.db1.dbname', $config); // will return mydatabase

请注意,您必须检查密钥是否存在,如果不存在则抛出错误或异常。

除了使用该功能之外,还有一个您不能这样做的原因:

function functionThatNeedsDatabaseInfo($databaseInfo)
{
    // do database stuff
}

functionThatNeedsDatabaseInfo($config['db']['db1']);
于 2012-08-20T22:45:05.500 回答
1

它们只是普通的嵌套数组。

$config['db']会给你第一个内部数组

$config['db']['db1']将为您提供包含您正在寻找的所有数据库配置的数组。

$config['db']['db1']['dbname']: 'dbname' 是 'db1' 数组中的索引,它将为您提供所需的值。

于 2012-08-20T22:39:40.407 回答
0
function read($layers, $arr){
    $toReturn = $arr;
    foreach(split('.', $layers) as $layer)
        $toReturn = $toReturn[$layer];
    return $toReturn;
}

你为什么要这样做,我没有最模糊的。但是你去。

于 2012-08-20T22:47:01.087 回答
-1

将那个东西投射到一个对象上!或者更确切地说,将每个数组转换为一个对象,然后您可以像使用它一样使用它。

$config = (object) array (
        (object) 'db' => array(
            (object) 'db1' => array(
                'dbname' => 'mydatabase', 
                'user' => 'myusername', 
                'pass' => 'mypassword', 
                'host' => 'myhost'
            )
        ),
        (object) 'url' => array(
            'homeUrl' => 'http://www.example.com'
        )
     )
于 2012-08-20T22:39:35.770 回答