从PHP数组中检索值

时间:2012-08-20 22:35:07

标签: php arrays configuration

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

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

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

5 个答案:

答案 0 :(得分:5)

我认为你正在考虑JSON

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

答案 1 :(得分: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']);

答案 2 :(得分:1)

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

$config['db']将为您提供第一个内部数组

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

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

答案 3 :(得分:0)

function read($layers, $arr){
    $toReturn = $arr;
    foreach(split('.', $layers) as $layer)
        $toReturn = $toReturn[$layer];
    return $toReturn;
}

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

答案 4 :(得分:-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'
        )
     )