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

4

我有一个多维数组,其中有一些重复的值,这些值按名称相同(名称是一个元素)
我想要对每个具有相同名称的数组进行数量求和,然后取消第二个数组
例子:

<?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函数。 - axiac
你尝试过使用 foreach() 吗? - RST
@RST已更新,foreach无法解决问题。 - Nima habibkhoda
你刚刚是只添加了这个函数,还是也用到了它? - RST
我使用它。我正在使用CodeIgniter框架进行开发,一切都很好,使用这个函数可以找到重复的值,主要部分是对值进行求和并删除另一个数组。 - Nima habibkhoda
@Nimahabibkhoda 移除旧数组不是问题。只需不再使用旧数组的变量,垃圾回收器就会将其删除。您也可以强制使用 unset 命令来删除旧变量。 - JensV
5个回答

1
尝试这个最简单的代码片段,希望对你有所帮助。

在这里尝试这段代码片段

$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
这个问题是使用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
));

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

0

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

在此处尝试代码


如果您想更改旧数组,请按以下方式使用该函数:
$myArray = sum_same($myArray);

旧数组将被新数组覆盖。


我的代码可以运行,但是有一个问题,它没有删除旧的数组。 - Nima habibkhoda
@Nimahabibkhoda 我更新了我的回答。如果它能够满足您的需求,请接受我的答案;如果不能,请进一步阐述您所说的“去除”和您想要实现的目标。 - JensV

0

试试这个,查看实时演示

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接