PHP实现弹出数组末尾元素并将其作为其余元素的键
解决PHP多维数组转嵌套键值结构的问题
需求说明
给定如下多维数组:
$inputArray = array( array( array('value31', 'value32'), array('value33', 'value34'), 'value21' ), 'value11' );
需要实现的逻辑是:从每个子数组中弹出最后一个元素作为键,将该数组剩余的所有元素作为这个键对应的值,最终得到如下嵌套结构:
$outputArray = array( 'value11' => array( 'value21' => array( array('value31', 'value32'), array('value33', 'value34'), ) ) );
原代码问题分析
你提供的convertArray函数存在以下核心问题:
- 递归键传递逻辑错误:将当前层级弹出的键传递给子数组递归处理,导致嵌套层级完全颠倒
- 多维数组判断不准确:使用
count($inputArray) != count($inputArray, COUNT_RECURSIVE)判断多维数组,当数组中混合数组与非数组元素时会出现误判 - 结果合并方式错误:用
array_merge合并递归结果,无法生成需求中的嵌套键值结构,反而会扁平化数据
正确实现代码
以下是满足需求的递归函数实现:
function convertArray(array $inputArray) { if (empty($inputArray)) { return []; } // 弹出当前数组最后一个元素,作为当前层级的键 $currentKey = array_pop($inputArray); $currentValue = []; foreach ($inputArray as $item) { // 对每个子数组递归处理,嵌套生成键值结构 if (is_array($item)) { $currentValue[] = convertArray($item); } else { $currentValue[] = $item; } } // 若当前值仅包含一个元素,直接取该元素(避免多余的数组层级) if (count($currentValue) === 1) { $currentValue = reset($currentValue); } // 返回当前层级的键值对 return [$currentKey => $currentValue]; }
测试验证
调用上述函数处理输入数组:
$inputArray = array( array( array('value31', 'value32'), array('value33', 'value34'), 'value21' ), 'value11' ); $outputArray = convertArray($inputArray); print_r($outputArray);
输出结果与需求完全一致:
Array ( [value11] => Array ( [value21] => Array ( [0] => Array ( [0] => value31 [1] => value32 ) [1] => Array ( [0] => value33 [1] => value34 ) ) ) )
内容的提问来源于stack exchange,提问作者Md Jahid Khan Limon
相关产品推荐
相关产品推荐

