Indice et tableau associatif

Petit nouveau ! | 3 Messages

04 mars 2009, 14:15

Salutatousse

J'ai un tableau associatif qui est rempli par une requête SQL, c'est un tableau à une seule dimension.
Je voudrais récupérer(conserver) les données X-1 et X+1, X étant un indice d'ordre

Je ne suis pas sur de bien m'expliquer... d'ailleurs c'est pas bien clair pour moi non plus

un bout de pseudo code car c'est juste imaginatif, je ne sais pas le faire en vrai ni s'il y a d'autres solutions pour faire ce que je veux

Code : Tout sélectionner

$l_cat = dbquery(" SELECT article_cat_id, article_cat_name, article_cat_description FROM ".DB_ARTICLE_CATS." WHERE ".groupaccess('article_cat_access')." ORDER BY article_cat_name ASC "); $i=0; while ($lst_cat = dbarray($l_cat)) { if ($lst_cat['article_cat_id'] == $id_cat_actuel) { $id_actuel = $i; } $i++; } $id_prec = $lst_cat[($id_actuel-1)]['article_cat_id'] $id_suiv = $lst_cat[($id_actuel+1)]['article_cat_id']
C'est possible ça ? où bien, avez vous une autre solution pour trouver $id_cat_actuel dans le tableau, sachant que les id ne sont pas dans le bon ordre et que seul l'ordre de "article_cat_name" m'intéresse.

Merci d'avance

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

04 mars 2009, 14:31

La question est : Que fait la fonction dbarray() et d'où vient la variable $id_cat_actuel car c'est la clé de voute du problème ?
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Petit nouveau ! | 3 Messages

04 mars 2009, 14:36

eeeuuuhhhhh bonne question :lol:

Si j'ai bien compris, dbarray met les données récupérés par dbquery dans un tableau associatif.
Quand à $id_cat_actuel on va dire que c'est une valeur qui se trouve dans la base et donc dans le tableau associatif

Question subsidiaire : plutôt que de parcourir tout le tableau, il n'y a pas moyen de trouver l'emplacement d'une valeur (et donc la précedente et la suivante) ?

En fait, j'ai l'impression qu'il manque une dimension à ce tableau : l'indice.

Merci pour la réponse si rapide

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

04 mars 2009, 20:33

Ok, je vais te proposer une autre solution:

L'idée est de stocker les enregistrements rendus par la requête dans un tableau de sortie indexé par id qu'on peut gérer par la suite.
// Exécuter la requête SQL
$l_cat = dbquery("
   SELECT article_cat_id, article_cat_name, article_cat_description
   FROM ".DB_ARTICLE_CATS."
   WHERE ".groupaccess('article_cat_access')."
   ORDER BY article_cat_name ASC
");

// Lecture des enregistrements du résultat SQL
$tab_articles = array();
while ($lst_cat = dbarray($l_cat)) {
    $id = $lst_cat['article_cat_id']; // récupèrer un id pour indexer le tableau de sortie
    $tab_articles[$id] = $lst_cat; // on ajoute l'enregistrement lu par dbarray() dans le tableau de sortie
}

// Traiter le tableau de sortie
$id_actuel = isset($_GET['id_actuel']) ? $_GET['id_actuel'] : 0; // cet id vient d'un paramètre http dans mon exemple

// calcul et validation des id suivant et précédent
$id_actuel = isset($tab_articles[$id_actuel])  ? $tab_articles[($id_actuel)]['article_cat_id'] : 0; // validation de l'id actuel
$id_prec = isset($tab_articles[($id_actuel-1)])  ? $tab_articles[($id_actuel-1)]['article_cat_id'] : 0;
$id_suiv = isset($tab_articles[($id_actuel+1)]) ? $tab_articles[($id_actuel+1)]['article_cat_id'] : 0;

...
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Petit nouveau ! | 3 Messages

05 mars 2009, 16:19

Bonjour et merci, mais... soit j'ai pas tout compris, soit je me suis mal exprimé

je pense que votre solution me donne la "valeur" de la catégorie précédente/suivante, alors que je voudrais le n° d'indice ou se trouve cette catégorie dans mon tableau

dis différemment car je ne suis pas sur de bien m'exprimer

si on trouve article_cat_id = à id_actuel alors on garde la position dans le tableau $tab_articles qu'on est en train de remplir de façon à ce que cette position-1 corresponde à l'article précedent et +1 au suivant, l'id de cet article étant sans rapport avec sa position car trié en ordre alphabétique des noms d'articles

fiche 1 = id 10
fiche 2 = id 5
fiche 3 = id 45

id idactuel = 5 alors précédent = 1 et suivant = 3

j'ai fais faux qqpart ?

Encore merci pour cette aide

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

05 mars 2009, 19:55

ok, donc si l'indice est indépendant de l'id cat. Ce qui est logique est de réserver des variables pour calculer les indices actuel, précédent et suivant à part, pour qu'en suite, pouvoir accèder avec dans le tableau pour récupèrer les données.
Voici la modif:
// Exécuter la requête SQL
$l_cat = dbquery("
   SELECT article_cat_id, article_cat_name, article_cat_description
   FROM ".DB_ARTICLE_CATS."
   WHERE ".groupaccess('article_cat_access')."
   ORDER BY article_cat_name ASC
");

// Lecture des enregistrements du résultat SQL
$tab_articles = array();
$i = 0;
$indice_actuel = 0;
while ($lst_cat = dbarray($l_cat)) {
    $tab_articles[$i] = $lst_cat; // on ajoute l'enregistrement lu par dbarray() dans le tableau de sortie
     if ($id_cat_actuel == $lst_cat['article_cat_id']) $indice_actuel = $i; // récupérer l'indice actuel
     $i ++; // incrémenter l'indice d'enregistrement
}

// calcul et validation des indices suivant et précédent
$indice_prec = isset($tab_articles[($indice_actuel-1)])  ? ($indice_actuel-1) : 0;
$indice_suiv = isset($tab_articles[($indice_actuel+1)]) ? ($indice_actuel+1) : 0;

// récupérer les id_cat actuel, suivant et précédent
$id_cat_actuel = $tab_articles[$indice_actuel]['article_cat_id'];
$id_cat_prec = $tab_articles[$indice_prec]['article_cat_id'];
$id_cat_suiv = $tab_articles[$indice_suiv]['article_cat_id'];
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

ViPHP
ViPHP | 1996 Messages

05 mars 2009, 22:47

Bon je vois que vous avez déjà bosser dessus mais je propose cela (j'utilise les fonctions standards que je connais):
$requete = "
   SELECT article_cat_id, article_cat_name, article_cat_description
   FROM ".DB_ARTICLE_CATS."
   WHERE ".groupaccess('article_cat_access')."
   ORDER BY article_cat_name ASC
");
$resultat_sql = mysql_query($requete);

while ($resultat= mysql_fetc_assoc($resultat_sql)) 
{
  if ($resultat['article_cat_id'] == $id_cat_actuel) {
    $id_actuel = $resultat['article_cat_id'];
  }
  $tab_recherche[$resultat['article_cat_id']["cat_name"] = $resultat["article_cat_name"];
  $tab_recherche[$resultat['article_cat_id']["cat_description"] = $resultat["article_cat_description"];
}
// pour le précédent
$id_actuel_inf = $id_actuel-1;
echo 'id_precedent = '.$id_actuel_inf .'<br />';
echo 'cat_name : '.$tab_recherche[$id_actuel_inf]["cat_name"].'<br />';
echo 'cat_name : '.$tab_recherche[$id_actuel_inf]["cat_description"].'<br />< br />';

// pour le suivant
$id_actuel_sup = $id_actuel+1;
echo 'id_precedent = '.$id_actuel_sup .'<br />';
echo 'cat_name : '.$tab_recherche[$id_actuel_sup]["cat_name"].'<br />';
echo 'cat_name : '.$tab_recherche[$id_actuel_sup]["cat_description"].'<br />< br />';
It is nice to be important but it is more important to be nice
http://www.aureuswebfactory.fr