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

时间:2010-02-12 15:21:36

标签: php regex

我有一个数组$AR
我有一个字符串"set[0][p1]"

当给出这个字符串时,我需要在$AR['set'][0]['p1']

访问数组的最佳方法

我对该字符串有完全的控制权,所以我不必担心注射和东西,我可以肯定它的格式很好。我无法将p1置于'"set[0]['p1']"

之内

4 个答案:

答案 0 :(得分:3)

检查parse_str()

parse_str('set[0][p1]', $AR);

哦,你想 访问 数组的索引......这是我的看法:

getValue($AR, array('set', 0, 'p1'));

或者如果你真的必须使用原始字符串表示:

parse_str('set[0][p1]', $keys);
getValue($AR, $keys);

免责声明:我没有对此进行测试,您可能需要在某处使用array_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;
}

我会避免重新解决这个问题。

答案 1 :(得分:3)

我的尝试,它应该能够处理字符串中任意数量的[]

要分割字符串,您可以使用preg_split

$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'

我将错误处理留给您;)

答案 2 :(得分:2)

也许这很疯狂,但你考虑过提取物吗?它可能不是最快的解决方案,但它具有需要最少代码的新颖性。

extract( $AR );
$target = eval("\$set[0]['p1']");

主要区别(就输入而言)是你需要在字符串中预先添加'$',并确保括号内有引号。

主要的好处是,你想要完成的事情变得非常明显,并且你正在使用两个本机PHP函数。这两者都意味着那些不熟悉您的系统的解决方案将更具“可读性”。

哦,你只使用两行代码。

答案 3 :(得分:0)

你需要类似的东西。我不是100%关于“[”和“]”括号,因为我以前从来没有对它们运行正则表达式...如果它错了可以有人纠正我吗?

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