PHP数组结构优化:合并嵌套子数组及foreach循环修正求助
解决数组嵌套冗余与foreach循环逻辑问题
首先看你当前的输出,每个子条目里都拆成了一个个单独的小数组,这显然不是想要的结构——咱们的目标是把同一行的id、server、login这些字段合并到同一个子数组里。
当前输出结构
Array ( [0] => Array ( [0] => Array ( [id] => asdasd ) [1] => Array ( [server] => asdadsasd ) [2] => Array ( [login] => asdasdads ) [3] => Array ( [ip] => adsads ) [4] => Array ( [date] => dasadsads ) ) [1] => Array ( [0] => Array ( [id] => 12123123 ) [1] => Array ( [server] => 123213213 ) [2] => Array ( [login] => 321231123 ) [3] => Array ( [ip] => 213231213 ) [4] => Array ( [date] => 321213213 ) ) )
期望输出结构
Array ( [0] => Array ( [id] => asdasd [server] => asdadsasd [login] => asdasdads [ip] => adsads [date] => dasadsads ) [1] => Array ( [id] => 12123123 [server] => 123213213 [login] => 321231123 [ip] => 213231213 [date] => 321213213 ) )
问题出在哪?
你原来的代码里,$commands[$name][] = array($key => $val);这一行是把每个字段的键值对单独封装成一个小数组,再追加到$commands[$name]里,自然就出现了多层嵌套。而直接用$commands[$name] = array($key => $val);会覆盖,是因为你每次都把整个子数组替换成了单个键值对,没有做合并。
修正后的代码逻辑
核心思路是:根据表单字段数组的下标(也就是每条数据的索引),把对应字段的键值对合并到同一个子数组里。
修改后的test2.php代码:
<?php //header('Content-Type: application/json'); $commands = array(); // 先遍历每个字段名(比如id、server、login这些) foreach($_POST as $key => $values) { // 跳过那个隐藏的insert-all字段 if($key === 'insert-all') continue; // 遍历当前字段的所有值,$index就是每条数据的索引(0、1...) foreach($values as $index => $val) { // 把当前字段的键值对放到对应索引的子数组里 $commands[$index][$key] = $val; } } print_r($commands); //echo json_encode($commands, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE); ?>
为什么这样能行?
- 外层循环遍历POST里的每个字段(
id、server等),跳过不需要的insert-all隐藏字段; - 内层循环遍历每个字段的所有值,
$index就是这条数据对应的条目序号(比如第0条数据的id、server都是$index=0); $commands[$index][$key] = $val直接把当前字段的键值对赋值到对应条目的子数组中,自然就把同一行的字段都合并到了一个子数组里,不会产生多余嵌套。
这样运行后,就能得到你想要的数组结构啦~
内容的提问来源于stack exchange,提问作者ScreamX
相关产品推荐
相关产品推荐

