2012-08-12 98 views
2

你好我试图计算一个关联数组,看起来像这样重复值的数量:查找重复的值,并将它们添加到数

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”元素。欢迎任何建议。

+0

对它们进行排序,然后运行一个foreach循环,比较一个与前者,并在每次相等时向计数器加1? – iaintunderstand 2012-08-12 20:39:09

+0

你有没有一个看起来如何的例子? – user1593846 2012-08-12 22:11:34

+0

嗯,我不是专家,但你知道有这样做的功能,没有必要发明任何东西。这里是这些函数的链接http://php.net/manual/en/array.sorting.php – iaintunderstand 2012-08-13 06:03:25

回答

1

如果要检测的DUP中要创建一个数组,像这样避免去通过阵列多次:

$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得到复本,看看这个:

您当前query--

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 

返回此套餐($关键字==“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 

执行聚合查询可避免所有关于循环的麻烦。这里有一个link到MySQL集合函数列表。

+0

非常感谢那个解决方案,查询正是我需要的,大赞。 – user1593846 2012-08-15 18:05:23

0

欧凯所以我发现我的解决方案,我把它看起来像这可能不是他最有效的方式,但它的工作原理:

$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 />"; 
} 

所以这几乎是它随意在这一点,如果发表您的意见你有任何改进随时发布。

+0

因为你正在做一个查询,为什么不找到与查询重复,而不是试图在结果数组中找到它们? – dnagirl 2012-08-14 17:14:05

+0

我对SQL不太好,所以我不知道我会如何计算重复次数,并将计数和标题添加到现有查询中的数组中。该查询如下所示:$ query =“SELECT prodTitle FROM product WHERE prodTitle!='{$ keyword}} AND creditCard IN( SELECT creditcard FROM product WHERE prodTitle ='{$ keyword}')“; – user1593846 2012-08-14 19:16:00

相关问题