php - PHP normalize multidimensional array
问题描述
want to normalize an array and need help.
Array i have:
$myArr = array(
array(
array(
array("id" => 1)
)
),
array("id" => 2),
array("id" => 3),
array(
array(
"id" => 4)
)
);
Array i want to have:
$myArr = array(
array("id" => 1),
array("id" => 2),
array("id" => 3),
array("id" => 4)
);
My idea to solve that prob is calling a recursive method, which is not working yet:
function myRecArrFunc(&myarr){
$output = [];
foreach{$myarr as $v}{
if(!isset{$v["id"]){
$output[] = myRecArrFunc($v);
} else{
$output[] = $v;
}
}
return $output
}
Currently the output of the function is the same as the input. Someone has an idea what have to be done?
解决方案
您可以使用RecursiveIteratorIterator
:
$result = [];
foreach(new RecursiveIteratorIterator(new RecursiveArrayIterator($myArr)) as $k => $v) {
$result[] = [$k => $v];
}
甚至更简单,array_walk_recursive
:
$result = [];
array_walk_recursive($myArr, function($v, $k) use (&$result) {
$result[] = [$k => $v];
});
关于您的代码
您的代码至少有 5 个语法错误,但忽略这些,您需要考虑到递归调用将返回一个数组,其中可能包含许多 id/value 对。因此,您需要将该数组连接到您当前的结果。您可以使用array_merge
使代码工作:
function myRecArrFunc(&$myarr){
$output = [];
foreach($myarr as $v){
if(!isset($v["id"])){
$output = array_merge($output, myRecArrFunc($v));
} else{
$output[] = $v;
}
}
return $output;
}
推荐阅读
- c# - 通过 ServerCertificateCustomValidationCallback 验证后使 X509Certificate2 可访问
- node.js - Nuxt,Express,套接字无法连接
- botframework - 如何使用 botbuilder-ai sdk 在 nodejs 中为 QnA 使用 strictFilters 参数
- opencv - opencv2/intensity_transform.hpp:没有这样的文件或目录
- visual-studio-2010 - 调试构建无法在其他机器上执行
- swift - 关闭从数据库快速检索数据的问题
- vue.js - IIS 和 Vue.JS - 获取 Windows Authenticated User
- certificate - itext7:延迟签名不产生有效的签名pdf
- python - 如何通过字典的值过滤列表?
- node.js - Cpanel 中的进程是什么?