如何结合array_walk处理多维表单数组,实现结构转换(无需foreach)
问题:如何用array_walk重组表单返回的二维数组?
我有一个表单返回的数组,结构如下:
$ticket_detail = [ 'ticket_id' => [101, 102, 103], 'price' => [10, 20, 30] ];
目前我可以通过array_map提取单列的键值对:
$arr = array_map(function ($x) { return $x[0]; }, $ticket_detail); // 输出结果: // Array // ( // [ticket_id] => 101 // [price] => 10 // )
现在需要不使用外层foreach循环,结合array_walk实现数组重组,得到如下目标结构:
Array ( [0] => Array ( [ticket_id] => 101 [price] => 10 ) [1] => Array ( [ticket_id] => 102 [price] => 20 ) [2] => Array ( [ticket_id] => 103 [price] => 30 ) )
解决方案
方法一:结合内部foreach(外层无foreach)
初始化空数组后,用array_walk遍历原始数组的每个字段,将对应索引的元素填充到结果数组中:
$result = []; array_walk($ticket_detail, function ($values, $key) use (&$result) { foreach ($values as $index => $value) { $result[$index][$key] = $value; } }); print_r($result);
方法二:完全使用array_walk嵌套(无任何foreach)
先通过reset()获取子数组长度,初始化结果数组的索引结构,再用两层array_walk完成填充:
// 获取子数组的元素数量 $itemCount = count(reset($ticket_detail)); // 初始化结果数组的空索引结构 $result = array_fill(0, $itemCount, []); // 外层遍历字段,内层遍历每个字段的元素 array_walk($ticket_detail, function ($values, $key) use (&$result) { array_walk($values, function ($value, $index) use (&$result, $key) { $result[$index][$key] = $value; }); }); print_r($result);
两种方法最终都能得到目标数组结构,其中方法二完全没有使用foreach循环,严格符合需求。
内容的提问来源于stack exchange,提问作者Ravi
相关产品推荐
相关产品推荐

