📜  php通过字符串访问多维数组 - PHP(1)

📅  最后修改于: 2023-12-03 14:45:29.894000             🧑  作者: Mango

PHP通过字符串访问多维数组

在PHP中,我们经常需要访问多维数组(数组中的数组)。通常,我们可以使用多个方括号来访问这些数组,例如 $arr[0][1][2]。然而,有时候我们需要通过一个字符串来访问数组的值,这时候怎么办呢?在本文中,我们将介绍如何使用字符串来访问多维数组。

使用eval函数

最简单也是最不安全的方法是使用eval函数。我们可以构造一个字符串,像下面这样:

$arr = array(
    'foo' => array(
        'bar' => array(
            'baz' => 'hello world'
        )
    )
);
$key = "['foo']['bar']['baz']";
eval("\$value = \$arr$key;");
echo $value; // 输出 'hello world'

注意,我们需要对字符串进行转义,以便在使用eval时不出错。使用eval有一个非常大的安全风险,因为它可以执行任何代码,包括用户输入的恶意代码。因此,最好不要在生产环境中使用eval函数。

使用call_user_func

另一种方法是使用call_user_func函数。我们可以将数组的每个键分解成一个数组,然后使用call_user_func来遍历整个数组。例如:

$arr = array(
    'foo' => array(
        'bar' => array(
            'baz' => 'hello world'
        )
    )
);
$key = "['foo']['bar']['baz']";
$keys = explode("][", trim($key, "[]"));
$value = call_user_func(function ($array, $keys) {
    foreach ($keys as $key) {
        $array = $array[$key];
    }
    return $array;
}, $arr, $keys);
echo $value; // 输出 'hello world'

这种方法比eval更安全,因为它不执行任何代码,只是访问数组的值。但是,由于它使用了匿名函数,可能会影响代码的可读性和维护性。

使用递归函数

另一种方法是使用递归函数来访问多维数组。我们可以递归地访问每个键,直到找到最后一个键为止。例如:

$arr = array(
    'foo' => array(
        'bar' => array(
            'baz' => 'hello world'
        )
    )
);
$key = "['foo']['bar']['baz']";
$keys = explode("][", trim($key, "[]"));
$value = array_value_recursive($arr, $keys);
echo $value; // 输出 'hello world'

function array_value_recursive($array, $keys) {
    $key = array_shift($keys);
    if (isset($array[$key])) {
        return is_array($array[$key])
            ? array_value_recursive($array[$key], $keys)
            : $array[$key];
    }
    return null;
}

这种方法比call_user_func更易于理解和维护,并且没有eval函数的安全风险。

总结

在PHP中,我们可以使用多种方法访问多维数组中的值。虽然eval函数是最简单的方法,但它有很大的安全风险。使用call_user_func和递归函数都比eval更安全,并且在代码的可读性和维护性方面具有优势。