PHP-如何对具有重复元素值的数组元素求和

时间:2017-05-14 10:31:55

标签: php arrays multidimensional-array duplicates

我有一个多数组,它有一些名称相同的重复值(名称是元素)
我想总结每个具有相同名称的数组的数量,然后取消设置第二个数组 示例:

<?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;
}
?>

5 个答案:

答案 0 :(得分: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));

答案 1 :(得分:1)

您可以通过创建一个以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);

旧数组将被新数组覆盖。

答案 2 :(得分:1)

试试这个,查看 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 :(得分:1)

此问题是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
));

答案 4 :(得分:1)

<?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,
  ),
)