You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用声明式方法转换数组?附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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 10:03:40