Php 如何将路径数组转换为具有不同深度的多维数组?
我想打开一组路径,如下所示:Php 如何将路径数组转换为具有不同深度的多维数组?,php,recursion,multidimensional-array,Php,Recursion,Multidimensional Array,我想打开一组路径,如下所示: $foo = [ 'a/b' => 1, 'a/c' => 2, 'x/y/0' => 4, 'x/y/1' => 5 ] 进入这样的多维数组,如下所示: $foo = [ 'a' => [ 'b' => 1, 'c' => 2], 'x' => [ 'y' => [0, 1] ] 路径数组可以包含任何深度的路径,可以是键值对,也可以是索引访问的普通数组。我尝试过递归,但不能完全理解这一点,尽管我
$foo = [
'a/b' => 1,
'a/c' => 2,
'x/y/0' => 4,
'x/y/1' => 5
]
进入这样的多维数组,如下所示:
$foo = [
'a' => [ 'b' => 1, 'c' => 2],
'x' => [ 'y' => [0, 1]
]
路径数组可以包含任何深度的路径,可以是键值对,也可以是索引访问的普通数组。我尝试过递归,但不能完全理解这一点,尽管我感觉解决方案会很短。有什么想法吗 您可以使用引用在输出数组中进行更深的移动(并创建新的键),而无需递归。类似这样的方法会奏效:
function nest($arr){
//our output array
$out = array();
//loop over the array and get each key/value
foreach($arr as $k=>$v){
//split the key
$k = explode('/', $k);
//create our first reference
$tmp = &$out;
//loop over the keys moving deeper into the output array
foreach($k as $key){
//if the key is not found
if(!isset($tmp[$key])){
//add it
$tmp[$key] = array();
}
//get a reference to the sub-array
$tmp = &$tmp[$key];
}
//here $tmp should be as far down the array as the value needs to be
//set the value into the array
$tmp = $v;
}
return $out;
}
演示:值
4
和5
发生了什么变化?x
键不应该以[4,5]
结尾,所以0=4
和1=5
?'x/y/0'=>4和'x/y/1'=>5意味着'x'=>'y'=>的值是一个数组,而不是一个映射/键值对。谈到这类事情,我希望这两个东西在PHP中有不同的名称,而不是都被称为“数组”,但是'x/y/0'
和x/y/1
中的4
和5
值发生了什么变化?它们只是消失,不再存在于建议的输出中。如何处理x/y/0/test
?此外,您确实意识到,如果要对输出进行json编码,则具有从零开始的连续数字键的数组将转换为JS数组,而不是对象([]
,而不是{}
)。如果您只想丢失该值(在=>
的右侧),并将键中的最后一个值作为附加到输出的值,那么您可以在下面的代码中执行该操作。这是一个简单的测试。