我想用字符串作为元素键动态设置/获取数组的元素。
所以我正在寻找将字符串转换为多键数组的好方法。
我用那段丑陋的代码达到了预期的结果,但我并不为此感到自豪:
function arrayElementSet($str, $value, array &$array)
{
$arrayStr = "['".preg_replace('/\./', "']['", $str)."']";
eval('$array'.$arrayStr.'="'.$value.'";');
}
function arrayElementGet($str, array &$array)
{
$arrayStr = "['".preg_replace('/\./', "']['", $str)."']";
eval('$ret=$array'.$arrayStr.';');
return $ret;
}
$array = array();
arrayElementSet('d0.d1.d2.d4', 'bar', $array);
$wantedElement = arrayElementGet('d0.d1.d2', $array);
print_r($array);
/*
wantedElement looks like:
Array
(
[d4] => bar
)
$array looks like:
Array
(
[d0] => Array
(
[d1] => Array
(
[d2] => Array
(
[d4] => bar
)
)
)
)
*/
但这非常丑陋,而且我想避免使用 eval() 函数。
我并不是特别喜欢数组解决方案,如果有一个带有对象或其他什么的很好的解决方案,我会接受它。
编辑:
只是想知道。 Laravel 的两个开箱即用的辅助函数(array_get 和 array_set):
最佳答案
分割和遍历:
<?php
function arrayElementSet($str, $value, array &$array, $delimiter = '.') {
$parent =& $array;
foreach (explode($delimiter, $str) as $key) {
if (!array_key_exists($key, $parent)) {
$parent[$key] = array();
}
$parent =& $parent[$key];
}
$parent = $value;
}
function arrayElementGet($str, array &$array, $delimiter = '.') {
$parent =& $array;
foreach (explode($delimiter, $str) as $key) {
if (!array_key_exists($key, $parent)) {
return null;
}
$parent =& $parent[$key];
}
return $parent;
}
$array = array();
arrayElementSet('d0.d1.d2.d4', 'bar', $array);
$wantedElement = arrayElementGet('d0.d1.d2', $array);
print_r($array);
print_r($wantedElement);
关于php - 将字符串转换为嵌套数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16916792/