IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Insérer variables dans une fonction [PHP 5.3]


Sujet :

Langage PHP

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 8
    Points : 6
    Points
    6
    Par défaut Insérer variables dans une fonction
    Bonjour,

    Je suis actuellement en train de créer un configurateur produit mais je bute sur un problème, que je pense assez bénin mais donc je n'arrive pas a me sortir.
    Une fonctionnailté de ce configurateur permet de rechercher un produit par sa référence.
    Après avoir exécuté ma requête, j'affiche le résultat dans un tableau.
    J'avais mis en place une fonction de tri en php qui, quand on clique sur un champs de colonne, recharge la page actuelle en ajoutant une condition ORDER BY à ma requête.
    Cependant, par souci de rapidité et d'organisation, j'ai souhaité abandonner cette solution.
    J'utilise maintenant array_multisort qui me permet de trier mon résultat directement a partir du résultat (sans rééxécuter la requête).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    foreach ($resultat as $key => $row) {
    	$tfamille[$key]  = $row['famille'];
    	$treference[$key] = $row['reference'];
    	$tdebit[$key]  = $row['debit'];
    	$tpmax[$key] = $row['pmax'];
    	$tvitesse_moteur[$key]  = $row['vitesse_moteur'];
    	$tcadence[$key] = $row['cadence'];
    }
    array_multisort($treference, SORT_DESC, $resultat);
    Je souhaiterai rendre cette fonction plus souple en y intégrant des variables afin d'éviter d'énumérer toutes les possibilités de tri. Du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $tri = "SORT_DESC";
    $champ = "$treference"
    array_multisort($champ, $toto, $resultat);
    Mais bien sur:
    array_multisort() [function.array-multisort]: Argument #2 is expected to be an array or a sort flag
    Est-ce que quelqu'un pourrait m'aider ?

    Merci

  2. #2
    Rédacteur/Modérateur
    Avatar de andry.aime
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    8 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ile Maurice

    Informations forums :
    Inscription : Septembre 2007
    Messages : 8 391
    Points : 15 059
    Points
    15 059
    Par défaut
    Bonjour,
    Utilise la fonction eval();

    A+.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 8
    Points : 6
    Points
    6
    Par défaut
    Je doit mal l'utiliser, je n'arrive pas a faire fonctionner la fonction eval().
    Quand je met :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    $tri = "SORT_ASC";
    $champ = "$treference";
    $res = "$resultat";
     
    $str = 'array_multisort($champ, $tri, $res)';
     
    echo $str."<br/>";
     
    $toto = eval( "\$str = \"$str\";" );
     
    echo $toto;
     
    echo $str;
    Il me retourne
    array_multisort($champ, $tri, $res)
    array_multisort(Array, SORT_ASC, Array)
    Au lieu de :
    array_multisort($treference, SORT_ASC, $resultat);
    Après, j'ai beau faire :
    Ca ne fonctionne pas...Normal
    A l'aide svp.

  4. #4
    Modérateur
    Avatar de Bisûnûrs
    Profil pro
    Développeur Web
    Inscrit en
    Janvier 2004
    Messages
    9 906
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2004
    Messages : 9 906
    Points : 14 828
    Points
    14 828
    Par défaut
    Pourquoi ne pas simplement faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $tri = SORT_DESC;
    $champ = $treference;
    array_multisort($champ, $tri, $resultat);

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 8
    Points : 6
    Points
    6
    Par défaut
    Parce que mon $treference je veux le générer.
    $champ = $treference
    Je n'ai aucun intérêt à le recopier a l'identique.

    Je m'explique:
    Quand je clique sur un champs, je recharge ma page avec un paramètre GET qui me précise le nom du champ à trier. c'est à partir de ce paramètre GET que je veut faire le tri.

    ex:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    $orderby = $_GET['orderby']; //ex:$orderby = treference
    $tri = $_GET['tri']; //$tri = SORT_ASC ou SORT_DESC
    $champ = "$".$orderby;
    $res = "$resultat"; //$resultat c'est mon tableau de résultat complet
     
    foreach ($resultat as $key => $row) {
    	$tfamille[$key]  = $row['famille'];
    	$treference[$key] = $row['reference'];
    	$tdebit[$key]  = $row['debit'];
    	$tpmax[$key] = $row['pmax'];
    	$tvitesse_moteur[$key]  = $row['vitesse_moteur'];
    	$tcadence[$key] = $row['cadence'];
    }
     
    $str = 'array_multisort($champ, $tri, $res)';
    Merci d'avance

  6. #6
    Modérateur
    Avatar de Bisûnûrs
    Profil pro
    Développeur Web
    Inscrit en
    Janvier 2004
    Messages
    9 906
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2004
    Messages : 9 906
    Points : 14 828
    Points
    14 828
    Par défaut
    Où est le problème ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    $orderby = $_GET['orderby']; //ex:$orderby = treference
    $tri = $_GET['tri']; //$tri = SORT_ASC ou SORT_DESC
    $champ = ${$orderby};
     
    foreach ($resultat as $key => $row) {
    	$tfamille[$key]  = $row['famille'];
    	$treference[$key] = $row['reference'];
    	$tdebit[$key]  = $row['debit'];
    	$tpmax[$key] = $row['pmax'];
    	$tvitesse_moteur[$key]  = $row['vitesse_moteur'];
    	$tcadence[$key] = $row['cadence'];
    }
     
    array_multisort($champ, constant($tri), $resultat);
    En n'oubliant pas de faire les vérifs nécessaires, comme vérifier si la constant passée en paramètre existe bien avant d'utiliser la fonction constant().

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    625
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 625
    Points : 822
    Points
    822
    Par défaut
    Sinon avec usort(), qui évite d'exploser le tableau en morceaux.

    Exemple en version cradingue :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    function tri( $a , $b ){
        $critere = $_GET['orderby'];
        if( is_numeric( $a[ $critere ] ) $out = $a[ $critere ] - $b[ $critere ];
        else $out = strcmp( $a[ $critere ] , $b[ $critere ] );
        return $_GET['tri'] == 'SORT_ASC' ? $out : -$out;
    }
     
    usort( $resultat , 'tri' );
    Code tapé directement sur le forum, il peut contenir des coquilles.

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 8
    Points : 6
    Points
    6
    Par défaut
    Merci Bisûnûrs je vais essayer.
    Excuse moi Petitbidon mais, peux tu m'expliquer comment fonctionne ton code, j'ai regarder la fonction usort() dans le manuel php , mais c'est un peu flou pour moi.
    Pense-tu que ce serai plus optimisé que la fonction array_multisort ?

    En tout cas, merci à tous pour vos réponses, cela m'est d'une grande aide.

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    625
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 625
    Points : 822
    Points
    822
    Par défaut
    C'est assez simple, usort() se base sur une fonction pour savoir si un élément de tableau doit être placé devant ou derrière un autre élément.

    Si la fonction utilisée renvoie un résultat négatif sur la comparaison de A et B, alors A est avant B, sinon on inverse A et B (en gros, je connais pas l'algo exact).

    Sinon pour expliquer plus la fonction fournie :
    Elle ressemble à l'exemple #2 de cette page : http://fr2.php.net/manual/fr/function.usort.php
    Pour expliquer l'idée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if( is_numeric( $a[ $critere ] ) $out = $a[ $critere ] - $b[ $critere ];
    si A et B sont numériques et A-B < 0, alors B est plus grand que A, donc A est avant B.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     else $out = strcmp( $a[ $critere ] , $b[ $critere ] );
    Si A et B sont des chaines, strcmp() renvoie un résultat du même style que A-B.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    return $_GET['tri'] == 'SORT_ASC' ? $out : -$out;
    Si on veut un tri ascendant, on renvoie le résultat fourni par les précédentes lignes, dans le cas contraire on inverse le résultat obtenu :
    - ( 1 ) = -1, - ( -1 ) = 1. (étant nul en math, même basiques, je suis pas sûr d'être très clair dans cette explication )

    Sinon, c'est l'utilisation de cette fonction qui pose problème ?

    Enfin, si je pense que c'est plus optimisé qu'avec array_multisort() : Sûrement vu que ça n'oblige pas à créer des sous-tableaux. Pis de toute manière je sais pas me servir de array_multisort()

  10. #10
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 8
    Points : 6
    Points
    6
    Par défaut
    Super, merci Petitbidon!
    J'ai réussi a faire fonctionner usort().
    Plus que quelques bricoles avec mon tri et ça roule comme sur des roulettes.
    Merci à tous.

    Viva developpez.com!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Passage de variables dans une fonction
    Par renaud26 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 01/07/2006, 18h49
  2. [Excel]Mettre une variable dans une fonction
    Par soad029 dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 14/04/2006, 13h00
  3. [Tableaux] Récuperer variable dans une fonction
    Par amarcil dans le forum Langage
    Réponses: 12
    Dernier message: 12/02/2006, 11h56
  4. Pb de variable dans une fonction :
    Par soad029 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 04/10/2005, 14h54
  5. [AS2] déclarer des variables dans une fonction
    Par ooyeah dans le forum ActionScript 1 & ActionScript 2
    Réponses: 12
    Dernier message: 02/08/2005, 13h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo