首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >数组键的变量

数组键的变量
EN

Stack Overflow用户
提问于 2019-02-28 14:31:12
回答 3查看 58关注 0票数 0

目前,我正在尝试调用多维数组,使用字符串作为一个或多个键。我想使用以下代码,但我认为键被解释为字符串。有解决办法吗?

代码语言:javascript
复制
$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'
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-02-28 15:12:25

如果需要动态数组访问解决方案,还可以编写一个函数,它执行实际的数组访问,如下所示:

代码语言:javascript
复制
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;
}

在你的例子中,这个应该是这样的

代码语言:javascript
复制
 echo path($data, 'volvo');
 echo path($data, 'drivers.mike');

代码语言:javascript
复制
 echo path($data, ['volvo']);
 echo path($data, ['drivers', 'mike']);
票数 1
EN

Stack Overflow用户

发布于 2019-02-28 14:33:18

您只需使用变量(应该是字符串,而不是PHP语法)来代替字符串文本。

代码语言:javascript
复制
$cars = [];
$cars['volvo'] = 'nice whip';
$test = 'volvo';
echo $cars[$test];
票数 2
EN

Stack Overflow用户

发布于 2019-02-28 15:11:48

问题是,您不能在这样的字符串中传递多个级别。(如果是这样的话,PHP将不得不开始寻找字符串数组键中的代码片段。它如何知道是将它们解释为片段,然后将字符串键拆分起来,还是继续将其视为一个字符串?)

Alt 1

一种解决方案是改变$data的结构,并使其成为一个单一级别的数组。然后,为查找数据所需的所有级别提供键,这些数据以字符串形式连接在一起。当然,您需要找到一个在您的情况下工作的分隔符。如果这些键是简单的字符串,那么像下划线这样简单的东西就会工作得很好。而且,这不会改变数据库的结构,只会改变数据的存储方式。

代码语言:javascript
复制
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"

Alt 2

另一种方法是不更改$data中的级别数,而只是使用传入的键遍历它:

代码语言:javascript
复制
$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"
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54927972

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档