【发布时间】:2011-08-08 11:05:44
【问题描述】:
我有一个包含数组元素的字符串。
$str = '[some][string]';
$array = array();
如何使用$str 获取$array['some']['string'] 的值?
【问题讨论】:
-
我认为您尝试做的事情无论如何都不是很好的做法。最好做
$array[$key1][$key2]。
我有一个包含数组元素的字符串。
$str = '[some][string]';
$array = array();
如何使用$str 获取$array['some']['string'] 的值?
【问题讨论】:
$array[$key1][$key2]。
这适用于任意数量的键:
$keys = explode('][', substr($str, 1, -1));
$value = $array;
foreach($keys as $key)
$value = $value[$key];
echo $value
【讨论】:
$array 替换为 array()
你可以通过使用eval来做到这一点,不知道你是否满意:
$array['some']['string'] = 'test';
$str = '[some][string]';
$code = sprintf('return $array%s;', str_replace(array('[',']'), array('[\'', '\']'), $str));
$value = eval($code);
echo $value; # test
然而 eval 并不总是正确的工具,因为它最常表明您在需要使用它时存在设计缺陷。
另一个例子,如果你需要对数组项进行写访问,你可以这样做:
$array['some']['string'] = 'test';
$str = '[some][string]';
$path = explode('][', substr($str, 1, -1));
$value = &$array;
foreach($path as $segment)
{
$value = &$value[$segment];
}
echo $value;
$value = 'changed';
print_r($array);
这实际上与Eric's answer中的原理相同,但引用了变量。
【讨论】:
// trim the start and end brackets
$str = trim($str, '[]');
// explode the keys into an array
$keys = explode('][', $str);
// reference the array using the stored keys
$value = $array[$keys[0][$keys[1]];
【讨论】:
我认为正则表达式应该做得更好:
$array['some']['string'] = 'test';
$str = '[some][string]';
if (preg_match('/\[(?<key1>\w+)\]\[(?<key2>\w+)\]/', $str, $keys))
{
if (isset($array[$keys['key1']][$keys['key2']]))
echo $array[$keys['key1']][$keys['key2']]; // do what you need
}
但在以您的方式处理数组之前,我会三思而后行:D
【讨论】: