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
相关产品推荐
相关产品推荐

