将字符串“array”转换为实际数组

11

现在我有一个数组的字符串,像这样:

$str = "array('a'=>1, 'b'=>2)";

我怎么将这个字符串转换为真正的数组?除了使用explode()函数之外,是否有其他更"聪明"的方法?因为这个"字符串"数组有时可能非常复杂。

谢谢!

7个回答

11
使用PHP的"eval"函数。
 eval("\$myarray = $str;");

像其他人说的一样,要小心!Eval会执行任何东西(想象一下黑客放置的mysql查询)。除非您已经创建了字符串(并确保它已“消毒”),否则请勿使用eval。 - JP19

8
我不知道一个好方法来做这个(只有邪恶的eval(),应该尽量避免)。但是:你从哪里获取字符串?它是你可以影响的吗?如果是这样,使用serialize() / unserialize() 将会是更好的方法。

3

当使用一个简短的数组时,json_decode可以正常工作。

json_decode('["option", "option2"]')

但是,与像 OP 提出的旧版本不同,它不支持。唯一可行的方法是使用Akash 的答案eval,但我并不喜欢使用它们。

json_decode('array("option", "option2")')

2

你需要使用 eval()

一个更好的方法来获取一个不需要使用 eval() 解码的数组的文本表示是使用json_encode() / json_decode()


2
你可以将字符串写入一个文件中,并在文件内用函数定义来包含该字符串,将文件命名为.php后缀。
然后在当前模块中引用该php文件,并调用函数以返回数组。

2

在任何情况下都不要使用eval(),而是使用strtoarray($str, 'keys')用于带有键的数组,strtoarray($str)用于没有键的数组。

function strtoarray($a, $t = ''){
    $arr = [];
    $a = ltrim($a, '[');
    $a = ltrim($a, 'array(');
    $a = rtrim($a, ']');
    $a = rtrim($a, ')');
    $tmpArr = explode(",", $a);
    foreach ($tmpArr as $v) {
        if($t == 'keys'){
            $tmp = explode("=>", $v);
            $k = $tmp[0]; $nv = $tmp[1];
            $k = trim(trim($k), "'");
            $k = trim(trim($k), '"');
            $nv = trim(trim($nv), "'");
            $nv = trim(trim($nv), '"');
            $arr[$k] = $nv;
        } else {
            $v = trim(trim($v), "'");
            $v = trim(trim($v), '"');
            $arr[] = $v;
        }
    }
    return $arr;
}

运行得非常好!感谢分享这个自定义函数,可以将字符串转换为字面量数组。 - Oliver

2
如果你信任这个字符串,可以使用eval。我不记得确切的语法,但应该可以工作。
$arr = eval($array_string);

如果字符串是由用户输入或来自其他不受信任的来源,则应在所有情况下避免使用eval()
要将数组存储在字符串中,可能需要查看序列化反序列化

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接