afficher aleatoirement un tableau

Mammouth du PHP | 965 Messages

12 juil. 2006, 12:58

Bonjour,

j'ai un tableau :
$sql = "SELECT * FROM `mix` WHERE lien LIKE '%'";
$query = mysql_query($sql) or die ('erreur '.mysql_error());
$array = mysql_fetch_array($query);
qui me donne des lien en :
$array['lien'];
donc la j'ai mon tableau avec tout les elements de la base de donnée je fais donc :
while(($array = mysql_fetch_array($query)) != false)
	{
		 echo $array['lien']."<br>";

	}
pour afficher tout les elements les un a la suite des autres, maintenant j'aimerais qu'il s'affiche en random, pour faire une playlist aleatoire.

On me conseille plusieurs commane comme : array_rand() ou array_push() mais pour ca il faudrait trouver le nombre d'elements dans le tableau et un :
 count($array['lien']) 
me retourne toujours : 1

Donc :

Comment faire pour compter le nombre d'elements du tableau ?
Est ce que les fonctions sont les bonne a utiliser ?

Et bien sur si vous avez d'autre maniere de voir le code je serais ravi de voir ce que vous pouvez me proposer ;)

Agité.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

12 juil. 2006, 13:23

Tu pourrais faire un mysql_numrows($query) pour savoir combien d'enregistement ont été retournés.

Cela dit, si tu utilises mysql, il existe une fonction ORDER BY RAND() qui te retournera les résultat de la base ordonné aléatoirement sans que tu ais besoin de te soucier de les récuperer dans un tableau et de les désorganiser ;)

Par ailleurs le "WHERE lien LIKE '%'" dans ta requête ne sert à rien, si tu veux tous les résultats, ne mets pas de where ;) (et préfère le nom des champs à un "SELECT *")

Mammouth du PHP | 965 Messages

12 juil. 2006, 13:41

ok ca me retourne bien le nombre d'enregistrement sur la table maintenant je fais ca :
while(($array = mysql_fetch_array($query)) != false)
	{
	   	 $tableau = array();
		 $push = array_push($tableau,$array['lien']);
		 $compter = mysql_num_rows($query);
		 $rand = array_rand($push,$compter);
		 echo $rand."<br>";

	}
pour qu'il me fasse un tableau aleatoire, mais il me retourne toujours :

Code : Tout sélectionner

Warning: array_rand(): First argument has to be an array in /home/agite/domains/electrogene.org/public_html/allpls.php on line 20

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

12 juil. 2006, 14:34

Sinon il y a ça : shuffle()

Mammouth du PHP | 965 Messages

12 juil. 2006, 14:40

while(($array = mysql_fetch_array($query)) != false)
	{
	   	 $tableau = array();
		 $push = array_push($tableau,$array['lien']);
		 $compter = mysql_num_rows($query);
		 $rand = shuffle($push);
		 echo $rand."<br>";

	}
shuffle me retourne l'erreur :

Code : Tout sélectionner

Warning: shuffle() expects parameter 1 to be array, integer given in /home/agite/domains/electrogene.org/public_html/allpls.php on line 19
comme s'il ne voyait pas le tableau non ?

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

12 juil. 2006, 14:42

Non c'est normal, regarde ce que renvoie array_push()

Mais du coup tu peux appliquer cette fonction directement sur le tableau renvoyé par mysql_fetch_array() , plus besoin des array_push() et compagnie

Mammouth du PHP | 965 Messages

12 juil. 2006, 14:47

ok donc en faisant :
while(($array = mysql_fetch_array($query)) != false)
	{
		 $rand = shuffle($array['lien']);
		 echo $rand."<br>";

	}
il devrait faire le necessaire mais il me retourne toujours cette erreur :

Code : Tout sélectionner

Warning: shuffle() expects parameter 1 to be array, string given

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

12 juil. 2006, 14:52

Le message d'erreur me paraît clair :

Code : Tout sélectionner

Warning: shuffle() expects parameter 1 to be array, string given
"shuffle() attend un paramètre tableau, une chaîne a été passée"

Relis ton code et tu verras.

Tu dois :
1 - récupérer un tableau
2 - le mélanger avec shuffl()
3 - l'afficher

Pas plus compliqué que ça. Si tu ne comprends pas regarde la doc de shuffle() (ce que tu aurais déjà dû faire)

Mammouth du PHP | 965 Messages

12 juil. 2006, 14:58

Pourtant il me semble qu'avec :
while(($array = mysql_fetch_array($query)) != false)
	{
		 $tableau = array($array['lien']);
		 $rand = shuffle($tableau);
		 echo $rand."<br>";

	}
je recupere bien un tableau
ensuite je le shuffle()
ensuite je l'affiche

Le code n'est pas bon quelque pars ?

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

12 juil. 2006, 15:08

$tableau = array($array['lien']); 
Avec cette ligne tu recrées un tableau avec la valeur courante de 'lien', ce n'est pas très logique.

J'ai pas tout suivi mais je vois qqchose comme ça :
while ($array = mysql_fetch_array($query)) {
   $tabLiens[] = $array['lien']; // tu ajoutes chaque lien dans un nouveau tableau
}
echo '<pre>';
echo '<b>Avant</b>';
print_r($tabLiens);

// you wash it, you wash it
$rand = shuffle($tabLiens);

if ($rand) { echo 'Mélange réussi'; } else { echo 'Mélange échoué'; }

// le nouveau tableau mélangé
echo '<b>Après</b>';
print_r($tabLiens);
echo '</pre>';
Modifié en dernier par ouckileou le 12 juil. 2006, 15:09, modifié 1 fois.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

12 juil. 2006, 15:08

Mais du coup tu peux appliquer cette fonction directement sur le tableau renvoyé par mysql_fetch_array()
Objection votre honneur... mon client ne veut pas mélanger les données de chaque ligne retournée par sa requête, il veut mélanger l'ordre des lignes retournées par se requête ;)

ce qu'il te faut c'est faire un tableau contenant chacune des lignes retournée par le mysql_fetch*, sortir du while et shuffler tout ça après. Et ensuite, reparcourir le tableau shufflisé pour les afficher dans le désordre :)

et d'où ma suggestion du "order by rand()" que tu te posais pas de question a pusher ou shuffler...

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

12 juil. 2006, 15:10

Mais du coup tu peux appliquer cette fonction directement sur le tableau renvoyé par mysql_fetch_array()
Objection votre honneur... mon client ne veut pas mélanger les données de chaque ligne retournée par sa requête, il veut mélanger l'ordre des lignes retournées par se requête ;)
Ouais je me suis planté... :oops:

Et le ORDER BY RAND oui c'est cool comme solution. Même si j'avais vu que c'était pas toujours super rand :lol:

Mammouth du PHP | 965 Messages

12 juil. 2006, 15:16

ah oui c'est vrai qu'avec un ORDER BY RAND c'est radical :
<?php

session_start();

require("connect.php");

$sql = "SELECT lien FROM `mix` ORDER BY RAND()";
$query = mysql_query($sql) or die ('erreur '.mysql_error());
$array = mysql_fetch_array($query);




while(($array = mysql_fetch_array($query)) != false)
	{
		 echo $array['lien']."<br>";

	}

?>
ca marche parfaitement merci beaucoup :)

je met le [Resolu]