📅  最后修改于: 2023-12-03 14:45:29.894000             🧑  作者: Mango
在PHP中,我们经常需要访问多维数组(数组中的数组)。通常,我们可以使用多个方括号来访问这些数组,例如 $arr[0][1][2]
。然而,有时候我们需要通过一个字符串来访问数组的值,这时候怎么办呢?在本文中,我们将介绍如何使用字符串来访问多维数组。
最简单也是最不安全的方法是使用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来遍历整个数组。例如:
$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更安全,并且在代码的可读性和维护性方面具有优势。