只删除一次重复值,然后对数组求和

Posted

技术标签:

【中文标题】只删除一次重复值,然后对数组求和【英文标题】:Remove duplicate values just once and then sum array 【发布时间】:2021-11-01 07:27:09 【问题描述】:

我想在我的数组中保留重复项,并且只在多次找到一个值时删除一次。

给定一个数组:

$array = ['+5', '+5', '+3', '+3', '+3', '+3', '+5', '+5'];

+5+3 各出现四次。我想只删除一个 +5 值和一个 +3 值,然后找到剩余值的总和。

$duplicate = ['+5', '+3'];
$array = ['+5', '+5', '+3', '+3', '+3', '+3', '+5', '+5'];

$i = 0;
foreach ($duplicate as $dup) 
    if (strpos($duplicate[$i], '+') !== false) 
        $duplicate[$i] = preg_replace('/[^0-9,:]/', '', $duplicate[$i]);
        $duplicate[$i] = "-$duplicate[$i]";
    
    $i++;

$sum = array_merge($duplicate, $array);
$end_value = array_sum(array_values($sum));
var_export($end_value);

对于我的输入,最终的总和应该是 24 (15 + 9)。

【问题讨论】:

我不明白the cards count them self。请通过根据您的样本输入呈现您想要的确切结果来强化所需的逻辑。你期待这个吗? 3v4l.org/24GRd 我看到 explode() 被调用,但我没有看到 $expode 在任何地方使用。我们是否使用连字符分隔的字符串 ($player_cards[$i2])?如果是这样,我可以在没有迭代函数调用的情况下删除重复项。请进一步解释。 $player_cards 只是一个卡片列表,不需要explode() 我并不是要在代码中添加它。谢谢你的帮助,但我确实找到了一种方法来解决这个问题,方法是创建一个 $duplicate_array,并将重复项添加到数组中。然后我在那里取相反的值并将它们添加到主 $add_p1_f1 数组 解决编程问题的方法通常不止一种。对于未来的研究人员来说,你的问题非常清楚是很重要的。请将请求的详细信息添加到您的问题中,并确认我的解决方案是否提供了您的预期输出。 没有。您不了解 Stack Overflow 页面设计。请拨打tour。您正在弄得一团糟,而不是像我问的那样提出完整的问题。您忽略了我确认我的演示链接提供所需结果的请求。这是新的必需输出,对吗? 3v4l.org/M20nU 【参考方案1】:

您需要记住从数组中删除的值。 在下面的脚本中,如果它第一次出现,则将其保存在 $existsValues 数组中。如果您再次找到相同的值,则将其删除(并将您所做的信息保存在 $deletedValues 数组中)。如果两个数组中都存在值,那么你什么也不做。这样一来,您总是删除第二次出现的值,仅此而已。

$existsValues = [];
$deletedValues = [];
foreach ($add_array as $key => $value) 
    if (!in_array($value, $existsValues)) 
        $existsValues[] = $value;
     else 
        if (!in_array($value, $deletedValues)) 
            $deletedValues[] = $value;
            unset($add_array[$key]);
        
    

【讨论】:

好吧,我所做的是将所有重复项添加到 $duplicates_array 中,然后我将它们取并翻转那里的值,以便 (+5) 变成 (-5) 和 (+3) = (-3 )... 然后我只使用了 array_merge( $duplicate[] ,$add_p1_f1[] ) 和 array_sum(array_values($add_p1_f1[] )); 如果任务最终以对卡片值求和结束,则不需要array_values()。解析技术不得以 cmets 的形式发布。解决建议应作为解释性答案发布。 我发布了一个工作代码作为答案,感谢 mickmackusa 的在线 php 编辑器。你可以看看我想做什么^^无论如何谢谢你的回答和帮助!【参考方案2】:

对所有值求和并忽略所有重复值的一次出现的任务可以在没有条件地维护重复数组的情况下完成,并且绝对不需要正则表达式。

代码:(Demo)

$array = ['+5', '+5', '+3', '+3', '+3', '+3', '+5', '+5'];

foreach (array_count_values($array) as $value => $count) 
    if ($count > 1) 
        unset($array[array_search($value, $array)]);
    

var_export(array_sum($array));    // 24

以上对值进行分组并计算它们的出现次数。然后,当值多次出现时,它只删除其中一个值。然后对改变后的数组求和。


或者您可以将其归结为一个数学过程:(Demo)

$total = 0;
foreach (array_count_values($array) as $value => $count) 
    $total += $value * ($count - ($count > 1));

echo $total;
// 24

^ 如果计数大于 1,则从乘数中减去 1。 (如果$count > 1,则true 被视为1;否则0)。

【讨论】:

@Ulta 如果您实际上不需要修改输入数组,我会建议您在项目中使用我的第二个 sn-p。

以上是关于只删除一次重复值,然后对数组求和的主要内容,如果未能解决你的问题,请参考以下文章

唯一的重复元素

26. 删除有序数组中的重复项-一次遍历

SQL group by 和 sum 基于其他列中的不同值(如果其他列中的值重复,则求和一次)

2021-09-20:给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O

如何在 SQL 中对每个 UniqueId 只求和一次?

删除排序数组中的重复数字买卖股票的最佳时机爬楼梯