将PHP字符串转换为多维数组

3
假设我有如下字符串保存在变量中:
$arr['data_|_multilanguage_|_en_|_field'] = 23;

我希望将其转换为如下的多维数组:
$arr['data']['multilanguage']['en']['field'] = 23;

我写了一个递归函数

foreach ($arr as $outer_key => $outer_value) {

    $parts = explode('_|_', $outer_key);

    $reference =& $arr;
    $final_key = count($parts) - 1;

    foreach ($parts as $key => $part) {
        if (!$final_key == $key) {

            if (empty($reference[$part])) {
                $reference[$part] = array();
            }

            $reference =& $reference[$part];

        } else {
            $reference[$part] = $arr[$str];
            unset($arr[$outer_key]);
        }
    }
}

问题在于var_dump显示子元素是引用类型。是否有更好的方式?


3
顺便说一下,您的函数是迭代的,而不是递归的;)) - moonwave99
2
可能是重复的问题:628176 /使用字符串路径设置嵌套数组数据 - Ryan Vincent
1
使用点符号设置数组的值^^分隔符 - moonwave99
3个回答

2
你的 if() 语句有误:
 if (!$final_key == $key) {}

!会在==之前被计算。
将其改为:

 if ($final_key != $key) {}

在你最后的$reference[$part] =赋值中,还有一个小问题,我已经在下面的代码中进行了更正。

$arr['data_|_multilanguage_|_en_|_field'] = 23;

foreach ($arr as $outer_key => $outer_value) {

    $parts = explode('_|_', $outer_key);

    $reference =& $arr;
    $final_key = count($parts) - 1;

    foreach ($parts as $key => $part) {

        if ($final_key != $key) { 

            if (empty($reference[$part])) {
                $reference[$part] = array();
            }

            $reference =& $reference[$part];

        } else {
            $reference[$part] = $outer_value;
            unset($arr[$outer_key]);
        }
    }
}

这是您的结果!

array(1) {
  ["data"]=>
  array(1) {
    ["multilanguage"]=>
    array(1) {
      ["en"]=>
      &array(1) {
        ["field"]=>
        int(23)
      }
    }
  }
}

$reference[$part] = $arr[$str]; 应改为 $reference[$part] = $outer_value; - palindrom
@palindrom 我在写帖子的时候刚看到了,谢谢。 - zessx
谢谢这个解决方案(稍作修改后),它解决了我遇到的问题 :) - mic

0

我认为这应该可以工作,传入你的(现有)数组、想要的键(为什么不使用点符号表示法代替“_|_”?)和你想要的值。

function array_set(&$array, $key, $value)
    {
        if (is_null($key)) return $array = $value;

        $keys = explode('_|_', $key);

        while (count($keys) > 1)
        {
            $key = array_shift($keys);

            // If the key doesn't exist at this depth, we will just create an empty array
            // to hold the next value, allowing us to create the arrays to hold final
            // values at the correct depth. Then we'll keep digging into the array.
            if ( ! isset($array[$key]) || ! is_array($array[$key]))
            {
                $array[$key] = array();
            }

            $array =& $array[$key];
        }

        $array[array_shift($keys)] = $value;

        return $array;
    }

0
<?php
$arr = array();
$arr['data_|_multilanguage_|_en_|_field'] = 23;
$arr['data_|_multilanguage_|_en_|_field2'] = 32;
$arr['data_|_multilanguage_|_fr_|_field'] = 57;
$arr['data_|_test'] = 57;
$arr['data_|_testing_|_var'] = 57;

function doArray(&$newarr,$keys,$value) {
    if(count($keys) > 1) {
        $key = array_shift($keys);

        if(!isset($newarr[$key]) || !is_array($newarr[$key])) {
            $newarr[$key] = array();
        }

        doArray($newarr[$key],$keys,$value);
    } else {
        $newarr[array_shift($keys)] = $value;
    }
}

$newarr = array();
foreach($arr AS $key => $value) {
    $keys = explode("_|_",$key);

    doArray($newarr,$keys,$value);
}

echo '<pre>';
print_r($newarr);
echo '</pre>';
?>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接