-1

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

我想检查“id”键,如果数组包含重复的“id”,那么应该将“antal”相互添加。

所以基本上输出必须是这样的: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;
}
4

3 回答 3

1

这段代码怎么样,每个 'aantal' 的初始值为 1,重复的 id 的 anantal 相互递增,重复的 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。
于 2013-10-17T15:03:45.590 回答
1

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

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 字段现在应该是正确的。

于 2013-10-17T15:03:49.883 回答
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;
}

?>
于 2013-10-17T14:40:02.403 回答