PHP识别&操纵多维数组中的重复项

时间:2013-11-26 12:38:32

标签: php arrays multidimensional-array duplicates

我有一个从表单发布的多维值数组,我试图不只是去掉它们,而是将重复数组中的值相加,以便这些值可以作为一个更大的值发布。

发布的数组如下:

Array
(
[0] => Array
    (
        [0] => 4
        [1] => 27/11/2013
    )

[1] => Array
    (
        [0] => 4
        [1] => 27/11/2013
    )

[2] => Array
    (
        [0] => 2
        [1] => 
    )

[3] => Array
    (
        [0] => 2
        [1] => 
    )

)

对于每个子数组,值0是数量,值1是日期(可选)。数组中的最后一个条目是2的数量,空白日期是自动添加的,因为所需的总数是12。

然后我使用foreach循环(下面)查看子数组以检查重复日期。

foreach ($qty_date_array as $key => $value)
{
    if(in_array($value[1], $exists) && !in_array($value[1], $duplicates))
    {
        $duplicates[] = $value[1]; 
    }
    else 
    {
        $exists[] = $value[1]; 
    }

$ duplicates的输出是......

Array
(
    [0] => 27/11/2013
    [1] => 
)

我想我想看一下数组中的值和foreach,找到相关的原始数值并求它们,但我不知道如何继续进行。

Array_search只会返回密钥,所以我猜这是不对的(我不能将Qty写为密钥,因为它可能是一个重复的值)。我已经涉足的其他数组函数,例如array_unique,根据索引折叠数组,因此丢失数据。

理想情况下,最终的多维数组看起来像这样:

Array
(
[0] => Array
    (
        [0] => 8
        [1] => 27/11/2013
    )

[2] => Array
    (
        [0] => 4
        [1] => 
    )
)

如果有人能提出更有效的方法来实现这一目标,我愿意接受所有建议!

2 个答案:

答案 0 :(得分:0)

如果缺少“可选”日期值,那么值是什么 - 只是NULL或空字符串?

如果是这样,这样的事情将起作用:首先使用日期作为关键字来汇总临时数组中的数据;然后将其转换为所需格式的数组:

$temp_data = $new_data = array();
foreach($data as $val) { // $data would be your original array here
  if(isset($temp_data[$val[1]])) {   // if entry for date already exists,
    $temp_data[$val[1]] += $val[0];  // add value to existing sum for that date
  }
  else {
    $temp_data[$val[1]] = $val[0];   // otherwise put it in as new value for date
  }
}
foreach($temp_data as $key => $val) {  // create numerically indexed array,
  $new_data[] = array($val, $key);     // using key (date) as item 0
}                                      // and summed up value as item 1

答案 1 :(得分:0)

$tmp = array();
foreach($data as $key => $value){
    if(isset($tmp[$value[1]])){
        $tmp[$value[1]][0] += $value[0];        
    }else{
        $tmp[$value[1]] = $value;
    }
 } 

 $data = array_values($tmp);