2013-03-18 90 views
0

我正在开发一个Drupal模块,该模块允许用户在其视图中使用超全局变量作为过滤器。他们需要能够进入一个领域他们想要使用的变量,然后我的功能需要然后去检索该变量的值。这很容易,如果你只允许一个级别,并且只有数组。但我想允许多个层次,甚至更好,允许他们访问对象和/或数组。如何以编程方式构建数组/对象调用

所以,如果用户要选择会话,然后输入: [ 'anarray'] [ 'anotherlevel'] [ '东西']

我的功能,然后将得到的值: $ _SESSION [ 'anarray'] [ 'anotherlevel'] [ '东西']

更妙的是,如果用户可以输入类似: [ 'anarray'] - > anotherlevel->的东西[ 'morethings']

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

依此类推。对于更简洁的代码,如果他们可以用+和 - 来分别表示一个数组和对象,那会更好。所以最后一个例子会输入为: + anarray-anotherlevel-something + morethings

任何想法?

+1

只是看看如何使用TREE结构。 – Oyeme 2013-03-18 19:36:53

回答

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; 
+0

工作出色,谢谢! – 2013-03-18 22:41:21

0

你必须分析输入的字符串寻找+-和对付他们。这真的不那么难。要分析字符串,你开始阅读每个字符,并检查它是否是+-。如果这是他们的一个开始录制的所有字符从那里到下一+/-标志并记录$current(最初$current = $_SESSION)压痕,因此如果您已经阅读+然后abc你更新$current

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