PHP按键前缀分组数据的代码优化请求
PHP代码优化:从扁平数组生成结构化多维数组
我来帮你梳理下这段代码的优化方向——原代码的三重嵌套循环确实让逻辑显得繁琐,而且在数据量变大时效率会明显下降。咱们可以从减少循环层级、精准匹配键名、利用数组映射提升效率这几个角度来改造:
优化后的代码
// 输入数据的主数组 $i = [ 'input_tickettype1_storeno_00' => null, 'input_tickettype1_deliverydate_00' => null, 'input_tickettype1_ticketref_00' => null, 'input_tickettype1_storeno_01' => '9874', 'input_tickettype1_deliverydate_01' => '2022-02-01', 'input_tickettype1_ticketref_01' => 'EDN6547', 'input_tickettype1_storeno_02' => '8547', 'input_tickettype1_deliverydate_02' => '2022-01-31', 'input_tickettype1_ticketref_02' => 'EDN5473', 'input_tickettype1_storeno_03' => '9214', 'input_tickettype1_deliverydate_03' => '2022-02-28', 'input_tickettype1_ticketref_03' => 'EDN1073' ]; // 表头数组 $h = [ 'input_tickettype1_storeno', 'input_tickettype1_deliverydate', 'input_tickettype1_ticketref' ]; // 1. 初始化最终数组:为每个表头创建带初始键的结构 $f = array_reduce($h, function($carry, $header) { $carry[] = [$header => null]; return $carry; }, []); // 2. 创建表头到$f索引的映射,实现O(1)快速查找 $headerIndexMap = array_flip($h); // 3. 遍历输入数组,拆分键名并填充对应值 foreach ($i as $key => $value) { // 拆分键:分离表头部分和末尾的索引(如_00、_01) $keyParts = explode('_', $key); $indexSuffix = array_pop($keyParts); $currentHeader = implode('_', $keyParts); // 如果当前表头在我们的目标列表中,就填充到对应位置 if (isset($headerIndexMap[$currentHeader])) { $f[$headerIndexMap[$currentHeader]][] = $value; } } print_r($f);
核心优化点说明
降低时间复杂度
原代码用了三重嵌套循环(遍历$f → 遍历$f的键 → 遍历$i),时间复杂度是O(nmk);优化后只需要两次线性循环(初始化$f + 遍历$i),复杂度降到O(n+m),数据量越大,效率提升越明显。精准键名匹配
原代码用str_contains匹配键名,存在误匹配风险(比如如果有表头input_tickettype1_storeno和input_tickettype1_storeno_extra,会错误匹配)。优化后通过explode拆分键名,精准分离表头和索引后缀,逻辑更可靠。高效索引查找
用array_flip把表头数组转换成「表头→数组索引」的映射,查找对应的$f位置时是常数时间操作,代替了原代码中遍历$f的线性查找。更紧凑的初始化逻辑
用array_reduce初始化$f,比单独的foreach循环更简洁,同时保持逻辑清晰。
输出验证
优化后的代码运行输出和你提供的原输出完全一致,保证了功能的兼容性。
内容的提问来源于stack exchange,提问作者numptyspence
相关产品推荐
相关产品推荐

