重复值多数组

时间:2013-10-17 14:25:17

标签: php arrays duplicates

正如标题所述,我正在寻找多阵列中的独特解决方案。 PHP不是我的世界所以我无法构建一个好的和快速的解决方案。 我基本上是从数据库中得到的:http://pastebin.com/vYhFCuYw

我想检查'id'键,如果数组中包含重复的'id',那么'aantal'应相互添加。

所以基本上输出必须是:http://pastebin.com/0TXRrwLs

提前致谢!

修改 如所提出的,尝试了许多人中的一个:

function checkDuplicates($array) {
    $temp = array();
    foreach($array as $k) {
        foreach ($array as $v) {
            $t_id = $k['id'];
            $t_naam = $k['naam'];
            $t_percentage = $k['percentage'];
            $t_aantal = $k['aantal'];
            if ($k['id'] == $v['id']) {
                $t_aantal += $k['aantal'];
                array_push($temp, array(
                        'id' => $t_id,
                        'naam' => $t_naam,
                        'percentage' => $t_percentage,
                        'aantal' => $t_aantal,
                    )
                );
            }
        }
    }
    return $temp;
}

3 个答案:

答案 0 :(得分:1)

尝试使用php的array_unique函数:http://php.net/manual/en/function.array-unique.php 它应该适用于数组

否则(如果你可以对数组进行排序 - >更快):

<?php

$db = array(....); // your data

function remove_duplicates (array $arr) {
  usort($arr, function ($a, $b) {
    return $a['id'] < $b['id'];
  });
  $result = array();
  $last_id = null;
  $last_index = -1;
  for ($i=0; $i<count($arr); ++$i) {
    if ($arr[$i]['id'] == $last_id) { 
      result[$last_index]['aantai'] += 1;
      continue; 
    }
    $last_id = $arr[$i]['id'];
    $last_index = count($result);
    $result[] = $arr[$i];
  }
  return $result;
}

?>

答案 1 :(得分:1)

这段代码如何,每个'aantal'的初始值为1,重复的id的aantal相互递增,并且不会抑制重复的id。由于您的第一个数组索引是基于0的数字,因此我们不将此维度视为哈希数组,而是将其视为普通数组。

更新:id可以重复2次,3次,4次,......

<?php
//
// duplicate elements are not suppressed:
//
function checkDuplicates($xarr) {
  //
  $xarrDone = array();
  //
  $n = count($xarr);
  //
  for($i = 0; $i < $n; $i++)
  {
    if(! isset($xarrDone[$i]))
    {
      $id0 = $xarr[$i]['id'];
      $hasId0 = array();
      for($j = $i + 1; $j < $n; $j++)
      {
        if($xarr[$j]['id'] == $id0)
        {
          $hasId0[] = $j;
        }
      }

      $n1 = count($hasId0);
      if($n1 > 0)
      {
        $xarr[$i]['aantal'] += $n1;
        $xarrDone[$i] = true;
        for($j = 0; $j < $n1; $j++)
        {
          $xarr[$hasId0[$j]]['aantal'] += $n1;
          $xarrDone[$hasId0[$j]] = true;
        }
      }
    }
  }
  //
  return $xarr;
}

//
// duplicate elements are suppressed:
//
function checkDuplicates2Unique($xarr) {
  //
  $xarrDone = array();
  $xarrNew = array();
  //
  $n = count($xarr);
  //
  for($i = 0; $i < $n; $i++)
  {
    if(! isset($xarrDone[$i]))
    {
      $id0 = $xarr[$i]['id'];
      $hasId0 = array();
      for($j = $i + 1; $j < $n; $j++)
      {
        if($xarr[$j]['id'] == $id0)
        {
          $hasId0[] = $j;
        }
      }

      $n1 = count($hasId0);
      if($n1 > 0)
      {
        $xarr[$i]['aantal'] += $n1;
        for($j = 0; $j < $n1; $j++)
        {
          $xarrDone[$hasId0[$j]] = true;
        }
      }
      $xarrNew[] = $xarr[$i];
      $xarrDone[$i] = true;
    }
  }
  //
  return $xarrNew;
}

//
// main test:
//
$xarr0 = array(
    array(
      'id' => 6
    , 'naam' => 'Aardmonnik'
    , 'percentage' => '8,00%'
    , 'aantal' => 1
  )
  , array(
      'id' => 34
    , 'naam' => 'Achel 8 Bruin'
    , 'percentage' => '8,00%'
    , 'aantal' => 1
  )
  , array(
      'id' => 34
    , 'naam' => 'Achel ppBruin'
    , 'percentage' => '9,00%'
    , 'aantal' => 1
  )
  , array(
      'id' => 34
    , 'naam' => 'Achel ppBruin'
    , 'percentage' => '9,00%'
    , 'aantal' => 1
  )
  , array(
      'id' => 3
    , 'naam' => 'IV Saison'
    , 'percentage' => '6,5%'
    , 'aantal' => 1
  )
  , array(
      'id' => 34
    , 'naam' => '3 Schténg'
    , 'percentage' => '6,00%'
    , 'aantal' => 1
  )
);
//
echo "<pre>
Original:
";
print_r($xarr0);
//
echo "</pre>";
//
$xarr = checkDuplicates($xarr0);
//
echo "<pre>
Modified:
";
print_r($xarr);
//
$xarr = checkDuplicates2Unique($xarr0);
//
echo "<pre>
Modified Unique:
";
print_r($xarr);
//
echo "</pre>";
?>

  1. checkDuplicates():保留重复的ID。
  2. checkDuplicates2Unique():删除重复的id以获取唯一ID。

答案 2 :(得分:1)

仅循环输入一次,然后在id为new时复制元素,否则添加值:

function checkDuplicates($array) {
    $temp = array();
    // Only loop through the input once
    foreach($array as $k) {
        // Use the id as array index
        if (array_key_exists($k['id'], $temp) {
            // Only check id and add aantal?
            $temp[$k['id']['aantal'] += $k['aantal'];
        } else {
            // Copy the element to the output
            $temp[$k['id']] = $k;
        }
    }
    return $temp;
}

根据您的进一步代码,您可能需要按sort()或其他方式重置数组索引。

编辑:对不起,我忘记了$ temp的索引 - 现在aantal字段应该是正确的。