我正在开发一个Drupal模块,允许用户在其视图中使用超全局变量作为过滤器。他们需要能够进入他们想要使用的变量的字段,然后我的函数需要去检索该变量的值。如果您只允许一个级别,并且只允许数组,这很容易。但我想允许多个级别,甚至更好,允许它们访问对象和/或数组。
因此,如果用户选择SESSION,则输入: ['anarray'] ['anotherlevel'] ['something']
我的函数将获得以下值: $ _SESSION [ 'anarray'] [ 'anotherlevel'] [ '东西']
如果用户可以输入以下内容,那就更好了: [ 'anarray'] - > anotherlevel->东西[ 'morethings']
我的函数会得到以下变量: $ _SESSION [ 'anarray'] - > anotherlevel->东西[ 'morethings']
等等。对于更清晰的代码,如果他们只能使用+和 - 来分别表示数组和对象,那就更好了。所以最后一个例子将输入为: + anarray-anotherlevel出头+ morethings
有什么想法吗?
答案 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;