当前,我正在尝试使用一个字符串作为一个或多个键来调用多维数组。我想使用以下代码,但是我认为键被解释为字符串。有解决办法吗?
$data= [];
$data['volvo'] = "nice whip";
$test = "['volvo']";
$data['drivers']['mike'] = "decent";
$test2 = "['drivers']['mike']";
echo $data$test; // should read 'nice whip'
echo $data$test2; // should read 'decent'
答案 0 :(得分:2)
您只需使用变量(应该只是字符串而不是PHP语法)代替字符串文字。
$cars = [];
$cars['volvo'] = 'nice whip';
$test = 'volvo';
echo $cars[$test];
答案 1 :(得分:1)
如果您需要动态数组访问解决方案,则还可以编写一个函数来执行实际的数组访问,如下所示:
function path($array, $path) {
$path = is_array($path) ? $path : explode('.', $path);
$current = $array;
while (count($path)) {
$seg = array_shift($path);
if (!isset($current[$seg])) throw new Exception('Invalid path segment: ' . $seg);
$current = $current[$seg];
}
return $current;
}
在您的情况下,看起来像这样
echo path($data, 'volvo');
echo path($data, 'drivers.mike');
或
echo path($data, ['volvo']);
echo path($data, ['drivers', 'mike']);
答案 2 :(得分:0)
问题是您不能像这样在一个字符串中传递多个级别。 (如果是这样,PHP将必须开始在字符串数组键中查找代码片段。它如何知道是将它们解释为片段,然后拆分字符串键,还是继续将其视为一个字符串?)
一种解决方案是更改$data
的结构,并使其成为单级数组。然后,为查找数据所需的所有级别提供键,它们以字符串形式连接在一起。您当然需要找到适合您的情况的分隔符。如果键是纯字符串,则下划线之类的简单名称应该可以正常工作。而且,这不会改变数据库的结构,只会改变数据的存储方式。
function getDbItem($keys) {
// Use this to get the "old version" of the key back. (I.e it's the same data)
$joinedKey = "['".implode("'],['", $keys)."']";
$joinedKey = implode('_', $keys);
return $data[$joinedKey];
}
// Example
$data = [
'volvo' => 'nice whip',
'drivers_mike' => 'decent'
];
var_dump(getDbItem(['drivers', 'mike'])); // string(6) "decent"
另一种方法是不更改$data
中的级别数,而只需使用传入的键进行遍历:
$tgt = $data;
foreach($keys as $key) {
if (array_key_exists($key, $tgt)) {
$tgt = $tgt[$key];
}
else {
// Non existing key. Handle properly.
}
}
// Example
$keys = ['drivers', 'mike'];
// run the above code
var_dump($tgt); // string(6) "decent"