PHP mixer deux tableaux


Meeuuuhhh
WRInaute passionné
WRInaute passionné
 
Messages: 2046
Inscription: 8 Jan 2007

PHP mixer deux tableaux

Message le Mer Jan 02, 2008 13:35

Bonjour,

Je souhaite savoir si il est possible de faire cela et si oui comment.

- Je récupère les messages du visiteur 1.
- Je récupère les messages du visiteur 4.
- Je classe ensuite leurs messages selon leur id.

Donc je vais avoir un premier tableau, puis un deuxième et ensuite je dois les mélanger et en reclasser les tuples selon leur id.


On peut faire ça :?: Si oui comment :?:


Merci d'avance :D


UsagiYojimbo
WRInaute accro
WRInaute accro
 
Messages: 8576
Inscription: 23 Nov 2005

Message le Mer Jan 02, 2008 13:36



Meeuuuhhh
WRInaute passionné
WRInaute passionné
 
Messages: 2046
Inscription: 8 Jan 2007

Message le Mer Jan 02, 2008 13:45

Salut UsagiYojimbo :D

Le truc c'est que c'est avec mysql, alors j'ai un peu de mal pour le script.

En gros, ça donnerait ça :?:
Code: Tout sélectionner
$A="SELECT message FROM membre WHERE idMembre=1 ORDER BY id";
$A= mysql_query("$A");
$A=mysql_fetch_array($A);


$R="SELECT message FROM membre WHERE idMembre=4 ORDER BY id";
$R= mysql_query("$R");
$R=mysql_fetch_array($R);

$tableau_final= array_merge ($A, $R);


C'est ça :?:

Mais là, comment je fais pour avoir le classement par ID des tuples de l'ensemble des deux tableaux :?:

Et comment je fais pour afficher le tout avec ma fonction while() maintenant :?:


UsagiYojimbo
WRInaute accro
WRInaute accro
 
Messages: 8576
Inscription: 23 Nov 2005

Message le Mer Jan 02, 2008 13:51

En fait y'a moyen de faire ça avec un seul ordre sql, et sans passer par des fonctions php supplémentaires (si je comprends ce que tu veux faire).

Le but est d'avoir la liste finale trié par id message ou id_membre ?

Par idMembre puis id de message :
Code: Tout sélectionner
$sql = "SELECT message FROM membre WHERE idMembre=1 AND idMembre=4 ORDER BY idMembre,id";
$res = mysql_query($sql);
$row = mysql_fetch_array($res))


Par id de message :
Code: Tout sélectionner
$sql = "SELECT message FROM membre WHERE idMembre=1 AND idMembre=4 ORDER BY id";
$res = mysql_query($sql);
$row = mysql_fetch_array($res))


Mais pour avoir l'ensemble des message il va te falloir parcourir ton resultset (ceci dans les deux cas).


Meeuuuhhh
WRInaute passionné
WRInaute passionné
 
Messages: 2046
Inscription: 8 Jan 2007

Message le Mer Jan 02, 2008 14:00

Oui ça a l'air bien.

Le problème c'est que je sais pas à l'avance combien je vais avoir de tableau à récupérer.

Peut-être les messages pour 4 ou 8 ou 11 membres...

Donc je pensais faire une boucle récupérant chaque fois un tableau.

Puis les mixer ensemble.

Avec ta dernière solution, ça va pas parce que je ne peux pas construire la requête comme ça, sauf erreur de ma part.


UsagiYojimbo
WRInaute accro
WRInaute accro
 
Messages: 8576
Inscription: 23 Nov 2005

Message le Mer Jan 02, 2008 14:03

Meeuuuhhh a écrit:Oui ça a l'air bien.

Le problème c'est que je sais pas à l'avance combien je vais avoir de tableau à récupérer.

Peut-être les messages pour 4 ou 8 ou 11 membres...

Donc je pensais faire une boucle récupérant chaque fois un tableau.

Puis les mixer ensemble.

Avec ta dernière solution, ça va pas parce que je ne peux pas construire la requête comme ça, sauf erreur de ma part.


Si tu connais les id_membre pour lesquels tu veux récupérer les messages, l'idée en ce cas est de les stocker dans une variable intermédiaire, qui sera constituée de la liste des idMembre, et de faire un WHERE IN :

Code: Tout sélectionner
$liste_mbr = "1,2,45,22,15,16";
$sql = "SELECT message FROM membre WHERE idMembre IN (".$liste_mbr.") ORDER BY id";
$res = mysql_query($sql);
$row = mysql_fetch_array($res))


Meeuuuhhh
WRInaute passionné
WRInaute passionné
 
Messages: 2046
Inscription: 8 Jan 2007

Message le Mer Jan 02, 2008 14:24

Ca à l'air de bien fonctionner !

Là je n'ai fait que tester, c'est pas encore dans la page, mais ça donne le bon résultat.

J'espère que je n'aurais pas à faire remonter le topic.


Un grand merci à toi UsagiYojimbo :)

( C'est du japonais ? ça veut dire quoi ? )


Meeuuuhhh
WRInaute passionné
WRInaute passionné
 
Messages: 2046
Inscription: 8 Jan 2007

Message le Jeu Jan 03, 2008 1:32

Bah si, je dois faire remonter le topic finalement :roll: :lol:

En fait, je ne sais pas comment récupérer un tableau via une requête, de manière à pouvoir ensuite m'en servir dans la suivante...

Ca c'est le code :

Code: Tout sélectionner
$a="SELECT idTel FROM mixe WHERE idTelPrincipal='".$id."' ";
$b=mysql_query("$a");

$R=array($b); <- ICI COMMENT JE RECUPERE LE TABLEAU POUR L'UTILISER EN DESSOUS ???

//on va chercher les titres des messages
$a="SELECT id,titre FROM message WHERE idTel IN (".$R.")  ORDER BY id ";
$b=mysql_query("$a");
while ($R=mysql_fetch_array($b)) <- ICI C'EST LA LIGNE 112 DU CODE D'ERREUR


Et donc là j'obtiens ça :roll:

Code: Tout sélectionner
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /home.10.13/site/scripts/repertoire/mixer.php on line 112


Elvis
WRInaute discret
WRInaute discret
 
Messages: 114
Inscription: 20 Mai 2005

Message le Jeu Jan 03, 2008 10:42

Remplace ton
Code: Tout sélectionner
$R=array($b);

par
Code: Tout sélectionner
$R = array();
while ($data = mysql_fetch_row($b))
     $R = $data[0].',' ;

$R = substr($data[0], 0, -1) ;


Meeuuuhhh
WRInaute passionné
WRInaute passionné
 
Messages: 2046
Inscription: 8 Jan 2007

Message le Jeu Jan 03, 2008 13:01

Ca ne fonctionne pas, j'ai le même code d'erreur.

J'ai essayé ça :

Code: Tout sélectionner
$tabRes=array();
while($R=mysql_fetch_array($b))
{
  $tabRes[] = $R['idTel'];
}


avec $tabRes[] dans la condition WHERE de la deuxième requête, mais j'obtiens ça :

Code: Tout sélectionner
Fatal error: Cannot use [] for reading in /home.10.13/site/scripts/repertoire/mixer.php on line 114


DreamJap
WRInaute discret
WRInaute discret
 
Messages: 114
Inscription: 6 Mai 2005

Message le Jeu Jan 03, 2008 16:00

Moi j'aurais fais ça :

Code: Tout sélectionner
$a="SELECT idTel FROM mixe WHERE idTelPrincipal='".$id."' ";
$b=mysql_query("$a");

// On récupére le premier élement
$R=mysql_fetch_row($b);
$tab_id = '';
$tab_id = $R[0];

// Les autres lignes
while ($R=mysql_fetch_array($b)) {
   $tab_id .= ',' . $R[0];
}

//on va chercher les titres des messages
$a="SELECT id,titre FROM message WHERE idTel IN (".$tab_id.")  ORDER BY id ";
$b=mysql_query("$a");
while ($R=mysql_fetch_array($b)){
// Ton code...
}



UsagiYojimbo
WRInaute accro
WRInaute accro
 
Messages: 8576
Inscription: 23 Nov 2005

Message le Jeu Jan 03, 2008 17:20

DreamJap a écrit:Moi j'aurais fais ça :

Code: Tout sélectionner
$a="SELECT idTel FROM mixe WHERE idTelPrincipal='".$id."' ";
$b=mysql_query("$a");

// On récupére le premier élement
$R=mysql_fetch_row($b);
$tab_id = '';
$tab_id = $R[0];

// Les autres lignes
while ($R=mysql_fetch_array($b)) {
   $tab_id .= ',' . $R[0];
}

//on va chercher les titres des messages
$a="SELECT id,titre FROM message WHERE idTel IN (".$tab_id.")  ORDER BY id ";
$b=mysql_query("$a");
while ($R=mysql_fetch_array($b)){
// Ton code...
}



Pourquoi récupérer le premier élément du résultset indépendamment des autres lignes ?

Code: Tout sélectionner
$sql = "SELECT idTel FROM mixe WHERE idTelPrincipal='".$id."' ";
$res = mysql_query("$a");

$tab_id = '';

//on récupère tous les éléments
while ($row = mysql_fetch_array($sql)) {
   $tab_id .= ',' . $row['idTel'];
}

$tab_id = substr($tab_id,1);

//on va chercher les titres des messages
$a="SELECT id,titre FROM message WHERE idTel IN (".$tab_id.")  ORDER BY id ";
$b=mysql_query("$a");
while ($R=mysql_fetch_array($b)){
// Ton code...
}



Edit : en donnant ma version j'ai compris le pourquoi du traitement en deux temps. Pas très optimisé je pense.


Meeuuuhhh
WRInaute passionné
WRInaute passionné
 
Messages: 2046
Inscription: 8 Jan 2007

Message le Ven Jan 04, 2008 13:19

Bon ça fonctionne, j'ai fait comme ça :
Code: Tout sélectionner
$r="
SELECT * FROM messages WHERE idTel IN ( SELECT idTelMix FROM mixer WHERE idTelPrincipal='".$canal."' AND idMembre='".$membre."') OR idTel='".$canal."' ORDER BY id ";
$b = mysql_query("$affiche");
// On cré une structure adapté pour récupérer le contenu du recordset
$tab=array(
  "id"  => array(),
  "texte" => array()
  );

// On transvide ton recordset dans la structure précédement créée
while($R=mysql_fetch_array($b))
{

  array_push($tab['id'],$R['id']);
  array_push($tab['texte'],$R['texte']);
}

for ($i=0 ;$i<count($tab['id']);$i++)
{



Merci à tous pour votre aide


:D


Si vous avez aimé cette discussion, partagez-la sur vos réseaux sociaux préférés :

Lectures recommandées sur ce thème :



Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 0 invités