【问题标题】:PHP- how to sum array elements with duplicate element valuePHP-如何对具有重复元素值的数组元素求和
【发布时间】:2017-05-14 10:31:54
【问题描述】:

我有一个多数组,其中包含一些名称相同的重复值(名称是一个元素)
我想对具有相同名称的每个数组的数量求和,然后取消设置第二个数组
示例:

<?php 
 $Array=array(
  0=>array("name"=>"X","QTY"=>500),
  1=>array("name"=>"y","QTY"=>250),
  2=>array("name"=>"X","QTY"=>250)
 );
?>


现在我想总结重复值如下。
结果:

<?php 
 $Array=array(
  0=>array("name"=>"X","QTY"=>750),
  1=>array("name"=>"y","QTY"=>250)
 );
?>

更新
我发现这个函数在数组、foreach 和另一个循环中搜索也不起作用

<?php
function search($array, $key, $value)
{
    $results = array();

    if (is_array($array)) {
        if (isset($array[$key]) && $array[$key] == $value) {
            $results[] = $array;
        }

        foreach ($array as $subarray) {
            $results = array_merge($results, search($subarray, $key, $value));
        }
    }

    return $results;
}
?>

【问题讨论】:

  • array_reduce() 是您要查找的 PHP 函数。
  • 你试过foreach()吗?
  • @RST 已更新,foreach 没有帮助。
  • 你是刚刚添加的功能还是实际使用了它?
  • 我用它。我正在研究codeigniter FrameWork,一切正常,使用此功能我可以找到重复值,主要部分是求和值并删除另一个数组

标签: php arrays multidimensional-array duplicates


【解决方案1】:

试试这个最简单的,希望对你有帮助。

Try this code snippet here

$result=array();
foreach ($Array as $value)
{
    if(isset($result[$value["name"]]))
    {
        $result[$value["name"]]["QTY"]+=$value["QTY"];
    }
    else
    {
        $result[$value["name"]]=$value;
    }
}
print_r(array_values($result));

【讨论】:

  • 它对我没有帮助
【解决方案2】:

试试这个,检查 live demo

<?php

$Array=array(
0=>array("name"=>"X","QTY"=>500),
1=>array("name"=>"y","QTY"=>250),
2=>array("name"=>"X","QTY"=>250)
);
$keys = array_column($Array, 'name');
$QTYs = array_column($Array, 'QTY');
$result = [];
foreach($keys as $k => $v)
{
  $result[$v] += $QTYs[$k];
}
print_r($result);

【讨论】:

    【解决方案3】:

    您可以通过创建一个以name 为键的数组然后遍历所有值并将它们相加来实现此目的

    function sum_same($array) {
    
        $keyArray = [];
    
        foreach ($array as $entry) {
            $name = $entry["name"];
            if(isset($keyArray[$name])) {
                $keyArray[$name] += $entry["QTY"];
            } else {
                $keyArray[$name] = $entry["QTY"];
            }
        }
    
        // Convert the keyArray to the old format.
        $resultArray = [];
        foreach ($keyArray as $key => $value) {
            $resultArray[] = ["name" => $key, "QTY" => $value];
        }
    
        return $resultArray;
    }
    

    Try the code here


    如果要更改旧数组,请使用如下函数:

    $myArray = sum_same($myArray);
    

    旧数组将被新数组覆盖。

    【讨论】:

    • 我工作但有问题,我没有删除旧数组。
    • @Nimahabibkhoda 我更新了我的答案。如果这样做是您想要的,请接受我的回答,如果不是,请进一步详细说明删除的含义以及您希望通过这样做实现的目标。
    【解决方案4】:

    这个问题是array_reduce()的经典用法示例:

    $Array = array(
        0 => array('name' => 'X', 'QTY' => 500),
        1 => array('name' => 'y', 'QTY' => 250),
        2 => array('name' => 'X', 'QTY' => 250),
    );
    
    
    // array_values() gets rid of the keys of the array produced by array_reduce()
    // they were needed by the callback to easily identify the items in the array during processing
    $Array = array_values(array_reduce(
        $Array,
        function (array $a, array $v) {
            $k = $v['name'];
            // Check if another entry having the same name was already processed
            // Keep them in the accumulator indexed by name
            if (! array_key_exists($k, $a)) {
                $a[$k] = $v;        // This is the first entry with this name
            } else {
                // Not the first one; update the quantity
                $a[$k]['QTY'] += $v['QTY'];
            }
            return $a;              // return the partial accumulator
        },
        array()                     // start with an empty array as accumulator
    ));
    

    【讨论】:

      【解决方案5】:
      <?php
      
      $Array=array(
      0=>array("name"=>"X","QTY"=>500),
      1=>array("name"=>"y","QTY"=>250),
      2=>array("name"=>"X","QTY"=>250)
      );
      
      $result = array();
      
      $names = array_column($Array, 'name');
      $QTYs  = array_column($Array, 'QTY');
      
      $unique_names = array_unique($names);
      
      foreach ($unique_names as $name){
          $this_keys = array_keys($names, $name);
          $qty = array_sum(array_intersect_key($QTYs, array_combine($this_keys, $this_keys)));
          $result[] = array("name"=>$name,"QTY"=>$qty);
      }
      

      var_export($result);

      array (
        0 => 
        array (
          'name' => 'X',
          'QTY' => 750,
        ),
        1 => 
        array (
          'name' => 'y',
          'QTY' => 250,
        ),
      )
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-10-25
        • 2014-12-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多