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

PHP中array_combine重复键处理:为重复键添加序号后缀

PHP合并数组时为重复键添加序号后缀

我有两个PHP数组,一个是值数组,一个是键数组:

值数组

Array(
    [0] => 24
    [1] => 24
    [2] => NOW
    [3] => false
    [4] => Boş
    [5] => USD
    [6] => 42.35
    [7] => false
    [8] => A2U0MT0XPL9B69
    [9] => Boş
    [10] => USD
    [11] => 0.0
    [12] => Boş
    [13] => US
    [14] => NJ
    [15] => new
    [16] => true
    [17] => Boş
    [18] => 1062
    [19] => 86.0
)

键数组

Array(
    [0] => minimumHours
    [1] => maximumHours
    [2] => availabilityType
    [3] => IsFulfilledByAmazon
    [4] => ListingPrice
    [5] => CurrencyCode
    [6] => Amount
    [7] => IsBuyBoxWinner
    [8] => SellerId
    [9] => Shipping
    [10] => CurrencyCode
    [11] => Amount
    [12] => ShipsFrom
    [13] => Country
    [14] => State
    [15] => SubCondition
    [16] => IsFeaturedMerchant
    [17] => SellerFeedbackRating
    [18] => FeedbackCount
    [19] => SellerPositiveFeedbackRating
)

使用array_combine($keysArray, $valuesArray)合并时,因为键数组里存在重复的CurrencyCode和Amount,导致后面的键值对覆盖了前面的,得到的结果如下:

Array(
    [minimumHours] => 24
    [maximumHours] => 24
    [availabilityType] => NOW
    [IsFulfilledByAmazon] => false
    [ListingPrice] => Boş
    [CurrencyCode] => USD
    [Amount] => 0.0
    [IsBuyBoxWinner] => false
    [SellerId] => A2U0MT0XPL9B69
    [Shipping] => Boş
    [ShipsFrom] => Boş
    [Country] => US
    [State] => NJ
    [SubCondition] => new
    [IsFeaturedMerchant] => true
    [SellerFeedbackRating] => Boş
    [FeedbackCount] => 1062
    [SellerPositiveFeedbackRating] => 86.0
)

我需要给重复的键添加_1、_2这类序号后缀,最终得到如下效果:

[CurrencyCode] => USD 
[Amount] => 42.35 
[CurrencyCode_1] => USD 
[Amount_1] => 0.0

解决方案

方法一:手动遍历统计键出现次数

通过遍历两个数组,维护一个计数器记录每个键的出现次数,重复时自动添加序号后缀:

// 定义键数组和值数组
$keys = [
    'minimumHours', 'maximumHours', 'availabilityType', 'IsFulfilledByAmazon',
    'ListingPrice', 'CurrencyCode', 'Amount', 'IsBuyBoxWinner', 'SellerId',
    'Shipping', 'CurrencyCode', 'Amount', 'ShipsFrom', 'Country', 'State',
    'SubCondition', 'IsFeaturedMerchant', 'SellerFeedbackRating', 'FeedbackCount',
    'SellerPositiveFeedbackRating'
];

$values = [
    24, 24, 'NOW', false, 'Boş', 'USD', 42.35, false, 'A2U0MT0XPL9B69',
    'Boş', 'USD', 0.0, 'Boş', 'US', 'NJ', 'new', true, 'Boş', 1062, 86.0
];

$result = [];
$keyCounter = [];

foreach ($keys as $index => $key) {
    // 初始化或累加计数器
    $keyCounter[$key] = isset($keyCounter[$key]) ? $keyCounter[$key] + 1 : 0;
    
    // 生成最终键名:首次出现用原键,重复则加序号
    $finalKey = $keyCounter[$key] > 0 ? "{$key}_{$keyCounter[$key]}" : $key;
    $result[$finalKey] = $values[$index];
}

print_r($result);

方法二:借助array_count_values预统计键出现次数

先统计每个键的总出现次数,再遍历处理重复键:

$keyCounts = array_count_values($keys);
$tempCounter = [];
$result = [];

foreach ($keys as $index => $key) {
    $tempCounter[$key] = isset($tempCounter[$key]) ? $tempCounter[$key] + 1 : 1;
    
    // 只有当键出现多次且当前不是第一次时,添加后缀
    if ($keyCounts[$key] > 1 && $tempCounter[$key] > 1) {
        $finalKey = "{$key}_" . ($tempCounter[$key] - 1);
    } else {
        $finalKey = $key;
    }
    
    $result[$finalKey] = $values[$index];
}

print_r($result);

两种方法都能保留所有键值对,避免覆盖问题,且支持任意数量的重复键(比如重复3次会生成_1、_2)。

注意:使用前确保两个数组长度一致,否则会丢失部分数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 08:52:02