【问题标题】:PHP Identifying & manipulating duplicates in multi-dimensional arrayPHP识别和操作多维数组中的重复项
【发布时间】:2013-11-26 12:38:31
【问题描述】:

我有一个从表单发布的值的多维数组,我不仅要对它们进行重复数据删除,还要对重复数组中的值求和,以便将它们作为一个更大的值发布。

贴出来的数组如下:

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,找到相关的原始 qty 值并将它们求和,但我不确定如何进一步进行。

Array_search 只会返回键,所以我猜它已经失效了(我不能将 Qty 写为键,因为它可能是重复值)。我接触过的其他数组函数,例如array_unique,会根据索引折叠数组,因此会丢失数据。

最终的多维数组在理想情况下应该是这样的:

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

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

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

【问题讨论】:

    标签: php arrays multidimensional-array duplicates


    【解决方案1】:

    如果缺少“可选”日期值——只是 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
    

    【讨论】:

    • 是的,这正是我想要的。我已经用大约 4 种不同的排列对其进行了测试,它可以满足我的需要。 :)
    【解决方案2】:
    $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);
    

    【讨论】:

      猜你喜欢
      • 2021-08-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-14
      • 2013-01-25
      • 1970-01-01
      • 2016-06-25
      相关资源
      最近更新 更多