2012-08-12 3 views
2

Salut, je suis en train de compter le nombre de valeurs en double dans un tableau associatif qui ressemble à ceci:Rechercher des valeurs en double dans un tableau associatif et les ajouter à un compte

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

Comme vous pouvez le voir ici là est une valeur dupliquée dans le titre "Title" Je veux les compter et en ajouter un à la partie "Count". J'ai commencé à faire quelque chose comme ceci:

$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. 
} 

la chose est que je ne peux pas accéder à l'élément « titre » dans le tableau par la fonction in_array. Toutes les suggestions sont les bienvenues.

+0

triez-les, puis exécutez une boucle foreach en comparant une avec la première et en ajoutant 1 à un compteur à chaque fois qu'elle est égale? – iaintunderstand

+0

Avez-vous un exemple de ce à quoi cela ressemblerait? – user1593846

+0

Eh bien, je ne suis pas un expert du tout, mais vous savez qu'il y a des fonctions qui font cela, il n'y a pas besoin d'inventer quoi que ce soit. Voici le lien vers ces fonctions http://php.net/manual/en/array.sorting.php – iaintunderstand

Répondre

1

Si vous voulez détecter dups dans un tableau que vous créez, quelque chose comme ceci éviter d'avoir à passer par le tableau à plusieurs reprises:

$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 

Si vous voulez simplement obtenir directement les dups par SQL, un coup d'oeil à ceci:

Votre query-- actuelle

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

dont les données étant donné que cette

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

renvoie ce set (avec mot-clé $ == 'A'):

prod 
B 
B 
C 

Une requête globale qui retourne seulement dossiers où les cartes de crédit utilisées sur la non-X ont également été utilisés sur X au moins deux fois -

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; 

étant donné les mêmes données, renvoie cet ensemble:

prod num 
B 2 

L'exécution d'une requête agrégée évite toute confusion avec les boucles. Voici un link à la liste MySQL des fonctions d'agrégat.

+0

merci beaucoup pour cette solution, la requête était exactement ce dont j'avais besoin, de grands pouces vers le haut. – user1593846

0

Okey donc j'ai trouvé ma solution et je l'ai fait ressembler à quelque chose comme ça sans doute pas qu'il manière la plus efficace, mais il fonctionne:

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

Donc, c'est à peu près, il ne hésitez pas à poster vos commentaires sur ce sujet et si vous avez des améliorations n'hésitez pas à les poster.

+0

puisque vous faites une requête, pourquoi ne pas trouver les doublons avec la requête plutôt que d'essayer de les trouver dans le tableau résultant? – dnagirl

+0

Je ne suis pas très bon avec SQL donc je ne sais pas comment je compterais le nombre de doublons et ajouterais le compte et le titre au tableau dans la requête existante que j'ai eue. La requête ressemble à ceci: $ query = "SELECT prodTitle FROM produit WHERE prodTitle!= '{$ keyword}' ET creditCard IN ( SELECT creditCard FROM produit WHERE prodTitle = '{$ keyword}') "; – user1593846

Questions connexes