Page 1 sur 1

Remplir un array de valeurs uniques depuis SQL

Posté : 19 oct. 2012, 15:13
par polpaulin
Bonjour

Je recupere une liste de mots clefs de tous les produits separes par une virgule dans une base de données

prod1 = a,b,c
prod2 = a,d,e
prod3 = b,c,f

a la fin je veux récupérer les mots clefs uniques : a,b,c,d,e,f

$q = 'SELECT keywords AS FROM products ';
$db->setQuery($q);
$rows = $db->loadRowList();
foreach ($rows as $row)
{
$kws .= $row[0]; // Je cree un grand string de tous les mots clefs
}

// un tableau de tous les mots clefs
$kw_all = explode(',' , $kws);

keywords = array_unique($kw_all);

et $keywords ne me retourne pas les mots clefs uniques tout y est x fois et pas une seule fois

comment faire ?

merci

Re: Remplir un array de valeurs uniques depuis SQL

Posté : 19 oct. 2012, 16:34
par xTG
Tu n'aurais pas tout simplement des mots clés avec des espaces après ou avant ?
Car non array_unique() n'est pas bugguée aux dernières nouvelles. ^^

Re: Remplir un array de valeurs uniques depuis SQL

Posté : 19 oct. 2012, 16:46
par sirakawa
[quote="polpaulin"
$rows = $db->loadRowList();
/* c'est se compliquer pour rien de mettre d'abord les mots dans une chaîne pour la convertir en tableau
        foreach ($rows as $row)
	    {
		$kws .= $row[0];  // Je cree un grand string de tous les mots clefs	 
	    }

// un tableau de tous les mots clefs
$kw_all = explode(',' , $kws);

keywords = array_unique($kw_all);
*/
/*je dirais que ceci fait la même chose:*/
$kw_all = array();
     foreach ($rows as $row)
	    {
		$kws_all[] .= $row[0]; 	 
	    }
/*mais pour tenir compte de la remarque de xtg:*/
$kw_all = array();
     foreach ($rows as $row)
	    {
	        $mot = trim($row[0]);
                 if (in_array($mot, $kw_all) != false))
                 {	
                      $kws_all[] .= $mot; 
                  }	 
	    }

[/quote]

Re: Remplir un array de valeurs uniques depuis SQL

Posté : 19 oct. 2012, 17:08
par polpaulin
merci pour vos réponses

j'ai eu cette reponse qui marche sur un autre forum

Code : Tout sélectionner

$kws=array();//important $q = 'SELECT keywords AS FROM products '; $db->setQuery($q); $rows = $db->loadRowList(); foreach ($rows as $row) { //$kws[] = $row[0]; $kws= array_merge($kws, explode(',',$row[0])); } $keywords = array_unique($kws);
par contre si j'essaye de le trier avec sort($keywords) il ne retourne plus rien

Re: Remplir un array de valeurs uniques depuis SQL

Posté : 19 oct. 2012, 17:47
par sirakawa
Ce qui me plairait c'est:
foreach ($rows as $row)
{
print "<br :>";
print_r($row) ;
print "<br :>";
$kws .= $row[0]; // Je cree un grand string de tous les mots clefs
}
et que tu postes ici le résultat affiché

Re: Remplir un array de valeurs uniques depuis SQL

Posté : 19 oct. 2012, 18:08
par asf21
@sirakawa pour polpaulin: lire
<br /> 
et pas <br :> !!!

:wink:

Re: Remplir un array de valeurs uniques depuis SQL

Posté : 19 oct. 2012, 18:25
par polpaulin
tout marche tres bien avec le code que j'ai poste , j'ai juste un probleme de tri
sort($keywords) ne me ramene plus rien

Re: Remplir un array de valeurs uniques depuis SQL

Posté : 19 oct. 2012, 21:09
par sirakawa
Donc rien ne marche correctement, puisque sort() fonctionne parfaitement, sauf dans ton cas...

Re: Remplir un array de valeurs uniques depuis SQL

Posté : 20 oct. 2012, 08:40
par polpaulin
mais dans ta fonction il n'y a pas d'explode pour recuperer les mots clefs separement
tel quel je ne recupere plus rien

je reposte le point où j'en suis actuellement et qui marche mais sans tri , ni trim et sans récupérer les occurrences dans la valeur

Code : Tout sélectionner

static function getKeywords(){ $kws = $kw_all = array(); // pour faire un trim $kw = ''; // pour recuperer les occurences $i = 0; $db =& JFactory::getDBO(); $q = 'SELECT keywords FROM product ;'; $db->setQuery($q); $rows = $db->loadRowList(); foreach ($rows as $row) { $kw_all = explode(',',$row[0]); $kws= array_merge($kws, $kw_all); } $keywords = array_unique($kws); return $keywords; }

merci encore pour l'aide

Re: Remplir un array de valeurs uniques depuis SQL

Posté : 20 oct. 2012, 12:09
par polpaulin
sur un autre forum j'ai

Code : Tout sélectionner

$sql = 'SELECT GROUP_CONCAT(DISTINCT keywords) FROM products'; $db->setQuery($sql); $raw_data = $db->loadResult(); $data = array_map('trim', explode(',', $raw_data)); $uniques = array_unique($data); $frequence = array_count_values($data); // array(value => count)
avec $frequence je récupère tout

mais avec
return sort($frequence);
ou
return asort($frequence);

je ne recuperes plus rien

comment faire pour avoir cette liste triée ? soit sur la cle soit sur la valeur ?

Re: Remplir un array de valeurs uniques depuis SQL

Posté : 20 oct. 2012, 12:58
par sirakawa
C'est bien pour ça que j'ai besoin d'un exemple du contenu de $row (dans le foreach) pour pouvoir simuler la situation.
Si dans ma fonction il n'y a pas d'explode, c'est que je n'avais pas compris que les valeurs étaient de la forme:
val11, val12,val13, ... val1n
val21, val22,val23, ... val2n
valp1, valp2,valp3, ... valpn
à tout hasard:
<?PHP

function decouper ($tableau)
{
	$resultat = array();
	foreach($tableau as $ligne)
	{
		$ligne = explode(",", $ligne);
		$mot = $ligne[0];
		if (in_array($mot, $resultat) == false)
		{
			$resultat[] = $mot;
		}
	}
	sort($resultat);
	return $resultat;
}

function decouper_trim ($tableau)
{
	$resultat = array();
	foreach($tableau as $ligne)
	{
		$ligne = explode(",", $ligne);
		$mot = trim($ligne[0]);
		if (in_array($mot, $resultat) == false)
		{
			$resultat[] = $mot;
		}
	}
	sort($resultat);
	return $resultat;
}
//tableau soigné
print "<h1>Tableau soign&eacute; fonction sans trim</h1>"; 
$vals = array ("amour,gloire,beauté, ..., val1n",
"amour, val22,val23, ..., val2n",
"gloire, val32, val 33,...,!!!",
"beauté, valp2,valp3, ..., valpn");
$resultat = decouper($vals);
print_r($resultat);

//tableau négligé
print "<h1>Tableau n&eacute;glig&eacute; fonction sans trim</h1>"; 
$vals = array ("amour ,gloire,beauté, ..., val1n",
"amour, val22,val23, ..., val2n",
"gloire, val32, val 33,...,!!!",
"beauté, valp2,valp3, ..., valpn");
$resultat = decouper($vals);
print_r($resultat);


print "<h1>Tableau n&eacute;glig&eacute; fonction avec trim</h1>"; 
$resultat = decouper_trim($vals);
print_r($resultat);


?>

Re: Remplir un array de valeurs uniques depuis SQL

Posté : 20 oct. 2012, 15:50
par polpaulin
merci

j'ai aussi trouve cette solution http://www.developpez.net/forums/d12719 ... ost6942299