PHP 多维数组中按唯一 ID 生成从 0 开始的连续序号

本文介绍如何将多维数组中重复出现的 range 值(如 336、390)统一映射为从 0 开始的紧凑整数序列(如 336→0,390→1),保持同 ID 元素序号一致,适用于分组标识、前端索引优化等场景。

本文介绍如何将多维数组中重复出现的 `range` 值(如 336、390)统一映射为从 0 开始的紧凑整数序列(如 336→0,390→1),保持同 ID 元素序号一致,适用于分组标识、前端索引优化等场景。

在 PHP 开发中,常需对多维数组中某一字段(如 'range')的重复值进行归一化编号——即把原始不连续、非零起始的 ID(如 336, 390, 336, 390)转换为逻辑上连续、从 0 开始的组序号(0, 0, 1, 1)。这种需求常见于数据分组渲染、Elasticsearch 聚合结果处理或前端表格按类别折叠展示等场景。

核心思路是:先提取所有唯一 range 值 → 按首次出现顺序排序 → 映射为 0, 1, 2, ... 的键值对 → 批量重写原数组中的 range 字段

以下是完整、健壮的实现方案:

<?php
// 示例输入数据
$array = [
    ['range' => 336, 'year' => 2020, 'month' => 222],
    ['range' => 336, 'year' => 2020, 'month' => 222],
    ['range' => 390, 'year' => 2020, 'month' => 222],
    ['range' => 390, 'year' => 2021, 'month' => 222],
];

// 步骤 1:提取所有 range 值,去重并重置键为连续数字(保证顺序稳定)
$uniqueRanges = array_values(array_unique(array_column($array, 'range')));

// 步骤 2:构建映射表:range_value → sequence_index
$rangeToIndex = array_flip($uniqueRanges);

// 步骤 3:遍历原数组,用映射表替换 range 值
$result = array_map(function ($item) use ($rangeToIndex) {
    $item['range'] = $rangeToIndex[$item['range']] ?? 0; // 安全兜底
    return $item;
}, $array);

print_r($result);
?>

输出结果

Array
(
    [0] => Array
        (
            [range] => 0
            [year] => 2020
            [month] => 222
        )
    [1] => Array
        (
            [range] => 0
            [year] => 2020
            [month] => 222
        )
    [2] => Array
        (
            [range] => 1
            [year] => 2020
            [month] => 222
        )
    [3] => Array
        (
            [range] => 1
            [year] => 2021
            [month] => 222
        )
)

? 关键说明

⚠️ 注意事项

此方法简洁、高效、无循环嵌套,是处理此类“ID→序号映射”问题的标准实践。

本文转载于:互联网 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。