如何以编程方式构建数组/对象调用

时间:2013-03-18 19:34:58

标签: php arrays drupal object dynamic

我正在开发一个Drupal模块,允许用户在其视图中使用超全局变量作为过滤器。他们需要能够进入他们想要使用的变量的字段,然后我的函数需要去检索该变量的值。如果您只允许一个级别,并且只允许数组,这很容易。但我想允许多个级别,甚至更好,允许它们访问对象和/或数组。

因此,如果用户选择SESSION,则输入: ['anarray'] ['anotherlevel'] ['something']

我的函数将获得以下值: $ _SESSION [ 'anarray'] [ 'anotherlevel'] [ '东西']

如果用户可以输入以下内容,那就更好了: [ 'anarray'] - > anotherlevel->东西[ 'morethings']

我的函数会得到以下变量: $ _SESSION [ 'anarray'] - > anotherlevel->东西[ 'morethings']

等等。对于更清晰的代码,如果他们只能使用+和 - 来分别表示数组和对象,那就更好了。所以最后一个例子将输入为: + anarray-anotherlevel出头+ morethings

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

$path = 'foo.bar.baz';

$value = $_SESSION;

foreach (explode('.', $path) as $key) {
    if (is_array($value) && array_key_exists($key, $value)) {
        $value = $value[$key];
    } else if (is_object($value) && property_exists($value, $key)) {
        $value = $value->$key;
    } else {
        throw new InvalidArgumentException(sprintf('The path %s does not exist', $path));
    }
}

echo $value;

答案 1 :(得分:0)

您必须解析输入的字符串,查找+-并处理它们。这真的不是那么难。要解析字符串,您可以开始阅读每个字符并检查它是+还是-。如果是其中之一,则您开始将所有字符记录到下一个+ / -符号,并使用$current(最初为$current = $_SESSION)记录缩进,以便您已阅读+,然后abc更新了$current

$current = (isset($current['abc'])) ? isset($current['abc'] : NULL;