2012-08-12 171 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

相關問題