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) } } 

ここでわかるように、「タイトル」ラベルに重複した値があり、それらをカウントして「カウント」部分に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 関数を介して配列内の「タイトル」要素にアクセスできないことです。どんな提案でも大歓迎です。

4

2 に答える 2

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で直接dupを取得したい場合は、これを見てください:

現在のクエリ--

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でも少なくとも2回使用されたレコードのみを返す集計クエリ-

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 リストへの リンクを次に示します。

于 2012-08-15T11:02:50.283 に答える
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 />";
}

ですから、これについてコメントを自由に投稿してください。改善点があれば、自由に投稿してください。

于 2012-08-14T17:06:57.873 に答える