如何用声明式方法转换数组?附PHP命令式实现示例
用声明式方法实现PHP数组层级转换
没问题!咱们把这段命令式的PHP数组转换改成声明式风格,让代码更聚焦于「要做什么」而非「具体怎么做」,可读性和简洁性都会提升不少。
先回顾下你提供的命令式实现和预期结果:
原命令式代码
$flat = [ [ '10', 'hoho'], [ '10', null], [ '13', null], [ '10', 'ahha'] ]; //imperative, procedural approach $hierarchical = []; foreach ($flat as $entry) { $id = $entry[0]; $hierarchical[$id]['id'] = $id; $hierarchical[$id]['microtags'] = $hierarchical[$id]['microtags'] ?? []; if ($entry[1] != null) array_push($hierarchical[$id]['microtags'], $entry[1]); }
预期执行结果
array ( 10 => array ( 'id' => '10', 'microtags' => array ( 0 => 'hoho', 1 => 'ahha' ) ), 13 => array ( 'id' => '13', 'microtags' => array () ) )
声明式实现方案
我们可以用PHP的array_reduce函数来实现,它是声明式编程中处理数组累加的常用工具,代码逻辑更简洁直观:
$flat = [ [ '10', 'hoho'], [ '10', null], [ '13', null], [ '10', 'ahha'] ]; $hierarchical = array_reduce($flat, function($accumulator, $entry) { $id = $entry[0]; // 初始化当前ID的结构(若尚未存在) if (!isset($accumulator[$id])) { $accumulator[$id] = ['id' => $id, 'microtags' => []]; } // 仅当microtag不为null时,添加到对应数组 if ($entry[1] !== null) { $accumulator[$id]['microtags'][] = $entry[1]; } return $accumulator; }, []);
代码说明
array_reduce会遍历整个扁平数组,通过回调函数逐步构建最终的层级结构($accumulator就是用来存储中间结果的累加器)。- 我们不需要手动维护循环状态,只需要定义每一步对当前条目的处理逻辑,代码逻辑和原命令式实现完全对齐,但更简洁易读。
- 执行这段代码后,输出结果和你给出的预期结果完全一致。
内容的提问来源于stack exchange,提问作者Jean Carlo Machado
相关产品推荐
相关产品推荐

