【问题标题】:Look for duplicate values in a associative array and add them to a count在关联数组中查找重复值并将它们添加到计数中
【发布时间】:2012-08-09 03:17:19
【问题描述】:

您好,我正在尝试计算关联数组中重复值的数量,如下所示:

array(3) { [0]=> array(3) { ["Title"]=> string(25) "hello" 
                            ["Price"]=> int(50) 
                            ["Count"]=> int(1) }
           [1]=> array(3) { ["Title"]=> string(35) "world" 
                            ["Price"]=> int(50) 
                            ["Count"]=> int(1) } 
           [2]=> array(3) { ["Title"]=> string(25) "hello" 
                            ["Price"]=> int(50) 
                            ["Count"]=> int(1) } } 

正如您在此处看到的,“标题”标签中有一个重复值,我想对它们进行计数并将其添加到“计数”部分。我开始做这样的事情:

$prodArray = array();

// Add the values to the array if it's the first time it occurs.
if (!in_array($row['prodTitle'], $prodArray["Title"]))
{
array_push($prodArray, 
           array( Title => $row['prodTitle'],
                  Price => $row['prodPrice'],
                  Count => 1)
          );
}
else
{
//Add one to the count for the current item.
}   

问题是我无法通过 in_array 函数访问数组中的“Title”元素。欢迎提出任何建议。

【问题讨论】:

  • 对它们进行排序,然后运行一个 foreach 循环,将一个与前者进行比较,并在每次相等时将 1 添加到计数器?
  • 你有一个例子吗?
  • 好吧,我根本不是专家,但你知道有一些功能可以做到这一点,不需要发明任何东西。这是这些功能的链接php.net/manual/en/array.sorting.php
  • 好吧,我已经了解了其中的一些功能,我发现了一些可能有用的东西,它看起来像这个链接上的第一个示例,我只是不完全理解代码,所以如果有人可以的话,我会很感激给我解释一下这个功能。 php.net/manual/en/function.uksort.php

标签: php arrays duplicates associative


【解决方案1】:

如果您想检测您正在创建的数组中的重复数据,这样可以避免多次遍历数组:

$arr=array();
while($row = mysql_fetch_array($result))  {                  
  $arr[$row['prodTitle']] = isset($arr[$row['prodTitle']]) 
                               ? $arr[$row['prodTitle']] +1 
                               : 0;                    
}
$dups = array_keys(array_filter($arr)); //any key => 0 will be filtred out

如果您只想通过 SQL 直接获取副本,请查看以下内容:

您当前的查询--

SELECT prodTitle 
  FROM product 
WHERE prodTitle != '{$keyword}' 
  AND creditCard IN( SELECT creditCard FROM product WHERE prodTitle ='{$keyword}');

它给出了这样的数据

prod cc
A    1
A    2
A    3
A    1
A    1
B    15
B    1
B    2
B    21
C    10
C    1

返回这个集合(使用 $keyword=='A'):

prod 
B
B
C

一个聚合查询,只返回条记录,其中在非 X 上使用的信用卡也至少在 X 上使用过两次 --

SELECT p1.prodTitle, COUNT(p2.creditCard) AS numrecords
  FROM product p1
    JOIN product p2
    ON (p1.creditCard = p2.creditCard)
WHERE p1.prodTitle != '{$keyword}'
  AND p2.prodTitle = '{$keyword}'
GROUP BY p1.prodTitle 
  HAVING COUNT(p2.creditCard) > 1;

给定相同的数据,返回这个集合:

prod  num
B    2

进行聚合查询可以避免所有的循环问题。这是 MySQL 聚合函数列表的link

【讨论】:

  • 非常感谢该解决方案,该查询正是我所需要的,大赞。
【解决方案2】:

好吧,所以我找到了我的解决方案,我让它看起来像这样可能不是他最有效的方式,但它有效:

$prodArray = array();
$ar = array();


$query ="THE QUERY";
$result = mysql_query($query) or die(mysql_error());

while($row = mysql_fetch_array($result))
{
array_push($ar, $row['prodTitle']);
}

function findDuplicates($data,$dupval) {
$nb= 0;
foreach($data as $key => $val)
if ($val==$dupval) $nb++;
return $nb;
}


$uniarr = array_unique($ar);

//Will run the function findDuplicates for each unique title in the array
for ($i = 0; $i < sizeof($uniarr); $i++)
{
$count = findDuplicates($ar, $uniarr[$i]);
array_push($prodArray, array( Title => $uniarr[$i], Count => $count));
}

//Displays 2 of the results in the array
for ($c = 0; $c < 2; $c++)
{
echo "The title:".$prodArray[$c]["Title"]." And the amount:".$prodArray[$c]["Count"];
echo "<br />";
}

因此,您可以随意在此发布您的 cmets,如果您有任何改进,请随时发布。

【讨论】:

  • 既然您正在执行查询,为什么不使用查询查找重复项,而不是尝试在结果数组中找到它们?
  • 我不太擅长使用 SQL,所以我不确定如何计算重复次数并将计数和标题添加到我得到的现有查询中的数组中。查询如下所示: $query ="SELECT prodTitle FROM product WHERE prodTitle != '{$keyword}' AND creditCard IN( SELECT creditCard FROM product WHERE prodTitle ='{$keyword}')";
猜你喜欢
  • 1970-01-01
  • 2015-09-24
  • 1970-01-01
  • 2014-12-27
  • 1970-01-01
  • 2019-10-18
  • 2021-11-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多