将字符串转换为嵌套数组

时间:2013-06-04 11:36:21

标签: php arrays

我想用字符串作为元素键动态设置/获取数组的元素 所以我正在寻找将字符串转换为多键数组的好方法 我用那段丑陋的代码达到了预期的结果,我并不为此感到骄傲:

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):

2 个答案:

答案 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);

http://codepad.viper-7.com/maNmOT

答案 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);