PHP实现嵌套数组扁平化:将子数组合并至父级为独立节点
解决PHP嵌套数组扁平化问题
需求说明
需要将嵌套的PHP数组转换为所有目标子数组(包含drive和wheel_drive键的数组)处于同一层级的结构。
原输入数组
array( array( 'drive' => array('test1'), 'wheel_drive' => array('2WD','4WD') ), array( 0 => array( 'drive' => array('test21','test31'), 'wheel_drive' => array('2WD','4WD') ), 1 => array( 'drive' => array('test32'), 'wheel_drive' => array('4WD') ) ), array( 'drive' => array('test4'), 'wheel_drive' => array('2WD','4WD') ) );
期望输出数组
array( array('drive' => array('test1'), 'wheel_drive' => array('2WD','4WD')), array('drive' => array('test21','test31'), 'wheel_drive' => array('2WD','4WD')), array('drive' => array('test32'), 'wheel_drive' => array('4WD')), array('drive' => array('test4'), 'wheel_drive' => array('2WD','4WD')) );
现有代码问题
你提供的flattenArray函数逻辑偏离需求,它会将元素按传入的key分组合并,而非完整提取包含drive和wheel_drive的子数组结构,因此无法得到预期结果。
正确实现代码
function flattenNestedArrays($array) { $result = []; foreach ($array as $item) { // 判断当前项是否是需要保留的目标子数组 if (is_array($item) && isset($item['drive']) && isset($item['wheel_drive'])) { $result[] = $item; } elseif (is_array($item)) { // 递归处理嵌套数组,合并结果 $result = array_merge($result, flattenNestedArrays($item)); } } return $result; } // 调用示例 $inputArray = array( array( 'drive' => array('test1'), 'wheel_drive' => array('2WD','4WD') ), array( 0 => array( 'drive' => array('test21','test31'), 'wheel_drive' => array('2WD','4WD') ), 1 => array( 'drive' => array('test32'), 'wheel_drive' => array('4WD') ) ), array( 'drive' => array('test4'), 'wheel_drive' => array('2WD','4WD') ) ); $outputArray = flattenNestedArrays($inputArray); print_r($outputArray);
代码逻辑说明
- 遍历输入数组的每个元素:
- 如果当前元素是包含
drive和wheel_drive的目标子数组,直接将其加入结果数组。 - 如果当前元素是嵌套的普通数组,递归调用函数处理该子数组,并将返回的扁平化结果合并到主结果中。
- 如果当前元素是包含
- 最终返回的结果数组即为所有目标子数组处于同一层级的结构。
内容的提问来源于stack exchange,提问作者Sy Gaur
相关产品推荐
相关产品推荐

