[英]Retrieve Value from PHP Array
我有一個數組來存儲這樣的配置
$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'
由於我不知道字符串中包含多少個鍵,因此我需要使其更具動態性。 提前致謝
我認為您正在考慮JSON
嘗試$config['db']['db1']['dbname'];
我真的很想知道您為什么要這樣做,但是事情就這樣了:
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']);
它們只是簡單的嵌套數組。
$config['db']
將給你第一個內部數組
$config['db']['db1']
將為您提供包含您要查找的所有數據庫配置的陣列。
$config['db']['db1']['dbname']
:'dbname'是'db1'數組中的索引,它將為您提供所需的值。
function read($layers, $arr){
$toReturn = $arr;
foreach(split('.', $layers) as $layer)
$toReturn = $toReturn[$layer];
return $toReturn;
}
你為什么要這么做,我還不是最霧蒙蒙的。 但是,你去了。
把那個東西扔到一個物體上! 或者更確切地說,將每個數組都轉換為對象,然后可以像使用它一樣使用它。
$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'
)
)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.