Php 如何向每个数组递归添加键?
我有这个数组Php 如何向每个数组递归添加键?,php,arrays,recursion,multidimensional-array,Php,Arrays,Recursion,Multidimensional Array,我有这个数组 Array ( [0] => Array ( [P1] => Array ( [P2] => Array ( . . . // n level ), ), ), [1] => Arr
Array (
[0] => Array (
[P1] => Array (
[P2] => Array (
.
.
.
// n level
),
),
),
[1] => Array (
[P4] => Array (
[P5] => Array (
.
.
.
// n level
),
),
),
),
我想把它转换成这个数组
Array (
[0] => Array (
'id' => 0
[P1] => Array (
'id' => 'P1',
[P2] => Array (
'id' => 'P2'
.
.
.
// n level
),
),
),
[1] => Array (
'id' => '1'
[P4] => Array (
'id' => 'P4'
[P5] => Array (
'id' => 'P5'
.
.
.
n level
),
),
),
),
如您所见,我获取了每个键,并将其映射到数组直接体中的“id”
这是我努力的结果
function recursive_function($arr)
{
$result = [];
if (is_array($arr)) {
foreach ($arr as $el) {
$result = array_merge($result, recursive_function($el));
}
} else {
$result[] = $input;
}
return $result;
}
我不熟悉递归函数和PHP的东西,所以无法思考如何映射、映射到哪里以及为什么
请帮我得到这个输出。任何帮助都将不胜感激。这是一个很好的编程类家庭作业问题。编写递归函数时,请从结束执行的案例开始。因此,假设我有我的数组,我想“修复”它: 基本情况是数组为空。如果是这样的话,我就把它退回,别的什么也不做
function fix($a) {
if(empty($a)) return $a;
}
如果它不是空的,我需要在元素之间循环。如果元素不是数组,请不要对其执行任何操作
function fix($a) {
if(empty($a)) return $a;
foreach($a as $i=>$v) {
if(!is_array($v)) // do nothing
}
}
所以,我只想做一些事情,如果它$v是一个数组。我想做什么?我想添加一个包含键($I在我的代码中)的索引
差不多完成了。我们没有递归调用。因为$v是一个数组,所以它也需要修复。这很容易做到:
function fix($a) {
if(empty($a)) return $a;
foreach($a as $i=>$v) {
if(is_array($v)) { // Only do something if $v is an array
$a[$i] = fix($v);
$a[$i]['id'] = $i;
}
}
}
现在,$v将被修复,并替换数组中的旧self。然后,将添加id索引。但是,有一些重要的事情要做。我们需要返回固定阵列
function fix($a) {
if(empty($a)) return $a;
foreach($a as $i=>$v) {
if(is_array($v)) { // Only do something if $v is an array
$a[$i] = fix($v);
$a[$i]['id'] = $i;
}
}
return $a;
}
@kainaw的答案很好,但这只是递归解决方案的更简单版本:
function addId(&$arr) {
foreach($arr as $k => &$v) {
addId($v);
$v = array_merge(["id" => $k], $v);
}
}
$arr = [["P1" => ["P2" => []]], ["P4" => ["P5" => []]]];
addId($arr);
请注意&
,它使用数据作为参考,因此原始数组正在更改
function fix($a) {
if(empty($a)) return $a;
foreach($a as $i=>$v) {
if(is_array($v)) { // Only do something if $v is an array
$a[$i] = fix($v);
$a[$i]['id'] = $i;
}
}
return $a;
}
function addId(&$arr) {
foreach($arr as $k => &$v) {
addId($v);
$v = array_merge(["id" => $k], $v);
}
}
$arr = [["P1" => ["P2" => []]], ["P4" => ["P5" => []]]];
addId($arr);