【问题标题】:php call array from stringphp从字符串调用数组
【发布时间】:2011-08-08 11:05:44
【问题描述】:

我有一个包含数组元素的字符串。

$str = '[some][string]';
$array = array();

如何使用$str 获取$array['some']['string'] 的值?

【问题讨论】:

  • 我认为您尝试做的事情无论如何都不是很好的做法。最好做$array[$key1][$key2]

标签: php arrays


【解决方案1】:

这适用于任意数量的键:

$keys = explode('][', substr($str, 1, -1));
$value = $array;
foreach($keys as $key)
    $value = $value[$key];

echo $value

【讨论】:

  • 其实这是最好的情况。我不会从@hakre中删除接受的,但我给了你+。感谢所有参与的人!
  • @Daniel:需要详细说明吗?
  • @Eric 不需要那个:)
  • Gaah,@BobGregor 编辑并破坏了它(将 $array 替换为 array()
【解决方案2】:

你可以通过使用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中的原理相同,但引用了变量。

【讨论】:

  • 如果他不习惯这样,他不应该这样存储字符串。
  • @Eric:不知道,但你的解决方案看起来好多了:)
  • 完美。我已经用 eval 试过了,但我做的不是很好。
【解决方案3】:
// 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]];

【讨论】:

  • 嗨,更大的数组呢?无论如何感谢您的回复!
  • 更大的数组不是原始问题的一部分!
【解决方案4】:

我认为正则表达式应该做得更好:

$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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-16
    • 2011-09-08
    • 2016-02-06
    • 2011-06-17
    • 1970-01-01
    • 2023-03-09
    • 2011-05-06
    • 2015-09-30
    相关资源
    最近更新 更多