Php 将字符串转换为数组的最佳方法

Php 将字符串转换为数组的最佳方法,php,regex,Php,Regex,我有一个数组$AR 我有一个字符串“set[0][p1]” 当给定此字符串时,我需要访问位于$AR['set'][0]['p1'] 我完全可以控制这个字符串,所以我不需要担心注入和其他事情,我可以确定它的格式会很好。我无法将p1放入“待设置”“设置[0]['p1']”中。检查: 哦,您想访问数组的索引。。。以下是我的看法: getValue($AR, array('set', 0, 'p1')); 或者如果确实必须使用原始字符串表示形式: parse_str('set[0][p1]', $k

我有一个数组
$AR

我有一个字符串
“set[0][p1]”

当给定此字符串时,我需要访问位于
$AR['set'][0]['p1']

我完全可以控制这个字符串,所以我不需要担心注入和其他事情,我可以确定它的格式会很好。我无法将p1放入“待设置”
“设置[0]['p1']”中。
检查:


哦,您想访问数组的索引。。。以下是我的看法:

getValue($AR, array('set', 0, 'p1'));
或者如果确实必须使用原始字符串表示形式:

parse_str('set[0][p1]', $keys);
getValue($AR, $keys);
免责声明:我尚未对此进行测试,您可能需要在某处使用
array\u keys()


和助手函数:

function getValue($array, $key, $default = false)
{
    if (is_array($array) === true)
    {
        settype($key, 'array');

        foreach ($key as $value)
        {
            if (array_key_exists($value, $array) === false)
            {
                return $default;
            }

            $array = $array[$value];
        }

        return $array;
    }

    return $default;
}

我会避免你陷入这个问题。

你需要类似的东西。我对“[”和“]”括号不是百分之百的关心,因为我以前从未在它们上运行过正则表达式。。。如果是错的,有人能纠正我吗

foreach(preg_split('/[\[\]]/', "set[0][p1]") as $aValue) {
    $AR[$aValue[0]][$aValue[1]][$aValue[2]] = '?';
}

My try,它应该能够处理字符串中任意数量的
[]
s:

要拆分字符串,可以使用

(更多)完整代码:


我将错误处理留给您;)

也许这很疯狂,但你考虑过摘录吗?它可能不是最快的解决方案,但它的新颖之处在于需要最少的代码

extract( $AR );
$target = eval("\$set[0]['p1']");
主要的区别(就输入而言)是需要将“$”预先挂起到字符串,并确保括号内有引号

主要的好处是,您正在尝试完成的任务变得非常明显,并且您正在使用两个本机PHP函数。这两种情况都意味着,对于那些不熟悉您的系统的人来说,解决方案将更具“可读性”


哦,您只使用了两行代码。

您是否“控制”了该字符串?也就是说,它是否保证“格式良好”且不包含任何恶意代码?这个问题实际上是一个相当有趣的问题,我完全打算把它偷走,使之成为一个“面试问题”。@Felix:是的,我刚刚意识到这一点。对不起=在当前版本中,“神奇的部分”是从“set[0][p1]”到数组(set,0,p1),如果op想要坚持原来的计划;)
parseString
将为您提供
数组([set]=>Array([0]=>Array([p1]=>))
,而不是平面数组。我想说最简单的方法是使用
preg_split
(就像在我的回答中一样),你的正则表达式会给出这样的结果:
Array([0]=>set,[1]=>0,[2]=>,[3]=>p1,[4]=>)
$parts = preg_split('%\[?(\w+)\]?%', $string, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
function get_value($string, $array) {
    $parts = preg_split('%\[?(\w+)\]?%', $string, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);

    foreach($parts as $part) {
        $array = $array[$part];
    }

    return $array;
}

$array = array('set'=>array(array('p1'=>'foo')));
$string = "set[0][p1]";

echo get_value($string, $array); // echoes 'foo'
extract( $AR );
$target = eval("\$set[0]['p1']");