我想用字符串作为元素键动态设置/获取数组的元素 所以我正在寻找将字符串转换为多键数组的好方法 我用那段丑陋的代码达到了预期的结果,我并不为此感到骄傲:
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的两个Helper函数开箱即用(array_get和array_set):
答案 0 :(得分:2)
Split&遍历:
<?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);
答案 1 :(得分:0)
function insertElementToArray($path, $value, &$array){
if (!is_array($path)){
$path = explode('.', $path);
}
if (($cnt = count($path)) == 0) return true;
$defValue = (array_key_exists($key = array_shift($path), $array))
? $array[$key]
: array();
$array[$key] = ($cnt == 1) ? $value : $defValue;
insertElementToArray($path, $value, $array[$key]);
}
使用:
insertElementToArray('d0.d1.d2.d4', 'bar', $array);