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

PHP中使用array_flip保留重复键的实现方法(附问题修正)

编辑说明:向社区致歉,该问题存在缺陷。若数组中存在重复键,后续极易引发问题。

首先得明确一个核心事实:PHP的数组不允许存在重复的键,所以你期望的array(1 => "red", 1 => "green", 2=> "orange")在PHP里是无法实现的——后面的键值对会直接覆盖前面的,这是数组的固有特性,并非array_flip函数的问题。

回到你的需求:想要保留原数组中所有对应相同值的键,我们可以换个思路——把相同值对应的原键收集成一个数组,作为翻转后该值对应的内容。

这里给你一个自定义函数来实现这个逻辑:

function array_flip_preserve_duplicates($input) {
    $flipped = [];
    foreach ($input as $originalKey => $originalValue) {
        // 如果这个值还没在结果里,先初始化一个空数组
        if (!isset($flipped[$originalValue])) {
            $flipped[$originalValue] = [];
        }
        // 将原键添加到对应值的数组中
        $flipped[$originalValue][] = $originalKey;
    }

    // 可选优化:如果某个值只对应一个原键,就把数组转换成单个值,和原生array_flip的表现更一致
    foreach ($flipped as $value => $keys) {
        if (count($keys) === 1) {
            $flipped[$value] = $keys[0];
        }
    }

    return $flipped;
}

// 测试你的示例数组
$arr = array( "red" => 1, "green" => 1, "orange" => 2);
print_r(array_flip_preserve_duplicates($arr));

运行这段代码后,你会得到这样的结果:

Array
(
    [1] => Array
        (
            [0] => red
            [1] => green
        )

    [2] => orange
)

这样既保留了所有原数组的键信息,又完全符合PHP数组的规则,不会出现键被覆盖的问题。

补充说明:若存在我未发现的重复情况,请在评论中告知我。


内容的提问来源于stack exchange,提问作者popeye

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:51:03