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 :

array en index d'un autre array


Sujet :

Langage PHP

  1. #1
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    226
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 226
    Points : 119
    Points
    119
    Par défaut array en index d'un autre array
    Bonjour,

    Je souhaite mettre en place un filtre pour des requête SQL. Je crée donc des requêtes dynamiques en fonction des données POSTées par le formulaire filtre.
    Pour certains éléments (des pourcentages par exemple) les données sont envoyées sous forme d'array pour dire que la données est comprise entre 20 et 80 par ex.
    Dans le cas des pourcentages, il faut effectuer 9 fois la même action, j'ai donc pensé à mettre l'index de chaque élément dans un array pour ensuite pouvoir boucler dessus 9 fois.
    Mais le serveur me dit que c'est un "type d'offset illegal"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    $iso[] = array("a1","a2","a3","a4","p1","p2","p3","p4","p5");
    	for($i=0 ; $i<=8 ; $i++) {
    		if(!empty(array_filter($_SESSION['searchForm']$iso[$i]))) {
    			$req.= (!empty($_SESSION['searchForm'][$iso[$i]][0]))? " $iso[$i] BETWEEN ".$_SESSION['searchForm'][$iso[$i]][0]." AND":" $iso[$i] BETWEEN 0 AND";
    			$req.= (!empty($_SESSION['searchForm'][$iso[$i]][1]))? " ".$_SESSION['searchForm'][$iso[$i]][1]." AND":" 100 AND";
    //$iso[$i][0] et $iso[$i][0] sont les valeurs min et max que l'on rentre dans le filtre.
    			}
    		}
    Le code fonctionne bien si je met les indexes comme il faut ($_SESSION['searchForm'][a1][0]) mais je préférerais quand même passer par une boucle ou quelque chose du genre.
    Si quelqu'un à un solution à mon problème, je suis preneur!

    Merci.

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Écris simplement ça donne ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $iso[] = array("a1","a2","a3","a4","p1","p2","p3","p4","p5");
     
    foreach ($iso as $col) {
    	$min = empty($_SESSION['searchForm'][$col][0]) ? 0 : $_SESSION['searchForm'][$col][0];
            $max = empty($_SESSION['searchForm'][$col][1]) ? 100 : $_SESSION['searchForm'][$col][1];
    	$req .= $col . ' BETWEEN ' . $min . ' AND ' . $max;
    }

  3. #3
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    226
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 226
    Points : 119
    Points
    119
    Par défaut
    Dieu que je suis nul...

    Merci pour la réponse.
    Bonne soirée

  4. #4
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Je m'autocorrige pour le AND entre chaque condition :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $iso[] = array("a1","a2","a3","a4","p1","p2","p3","p4","p5");
     
    foreach ($iso as $col) {
    	$min = empty($_SESSION['searchForm'][$col][0]) ? 0 : $_SESSION['searchForm'][$col][0];
            $max = empty($_SESSION['searchForm'][$col][1]) ? 100 : $_SESSION['searchForm'][$col][1];
    	$where[] = '(' . $col . ' BETWEEN ' . $min . ' AND ' . $max . ')';
    }
    $req .= implode(' AND ', $where);

  5. #5
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    226
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 226
    Points : 119
    Points
    119
    Par défaut
    Bonjour,
    En fin de compte, ça ne marche pas avec ce code, j'ai bien fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    $iso[] = array("a1","a2","a3","a4","p1","p2","p3","p4","p5");
     
    foreach ($iso as $col) {
    	$min = empty($_SESSION['searchForm'][$col][0]) ? 0 : $_SESSION['searchForm'][$col][0];
            $max = empty($_SESSION['searchForm'][$col][1]) ? 100 : $_SESSION['searchForm'][$col][1];
    	$where[] = '(' . $col . ' BETWEEN ' . $min . ' AND ' . $max . ')';
    	$req .= implode(' AND ', $where);
            }
    Mais j'obtiens encore l'erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Warning: Illegal offset type in /var/www/html/import_BDD.php on line 80
    Une autre solution peut-être?

  6. #6
    Membre régulier
    Profil pro
    Développeur Web
    Inscrit en
    Octobre 2010
    Messages
    153
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Octobre 2010
    Messages : 153
    Points : 107
    Points
    107
    Par défaut
    Bonjour,
    l'erreur ne nous dit pas quelle ligne du code est fausse mais a priori il doit manquer un des $col dans $_SESSION['searchForm'].
    Il faudrait faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    foreach ($iso as $col) {
    if (!key_exists($col, $_SESSION['searchForm'])) continue;
    ...}
    ou donner les valeurs par défaut min et max si la clé est absente.

  7. #7
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    226
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 226
    Points : 119
    Points
    119
    Par défaut
    Bonjour et merci pour votre réponse.
    Effectivement j'ai donné l'erreur sans mettre le code qui va avec...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    if(!empty(array_filter($_SESSION['searchForm'][$col])))// <-- ligne 80
     
    Warning: Illegal offset type in /var/www/html/import_BDD.php on line 80
    Les array provenant d'un formulaire, il me semblait qu'ils ne sont jamais vide de base c'est pourquoi j'effectue un test avec "array_filter" mais déjà dans la condition, il me rapporte une erreur sur l'index...

    En effet utiliser le min et le max est une solution mais pour cela, il faudrait pouvoir tester si ils existent (ou soient vides) mais le problème est plus haut apparemment.

  8. #8
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Citation Envoyé par flavors Voir le message
    Une autre solution peut-être?
    Ce n'est pas parce que TU ne sais pas utiliser la solution proposée qu'elle est mauvaise...

    Copier-coller sans comprendre...

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $where = array();
    foreach ($iso as $col) {
    	$min = empty($_SESSION['searchForm'][$col][0]) ? 0 : $_SESSION['searchForm'][$col][0];
            $max = empty($_SESSION['searchForm'][$col][1]) ? 100 : $_SESSION['searchForm'][$col][1];
    	$where[] = '(' . $col . ' BETWEEN ' . $min . ' AND ' . $max . ')';
    }
    var_dump($where); // afin de comprendre ce qui s'y passe ;)
    $req .= (!empty($where))? implode(' AND ', $where) : '';
    echo $req;  // afin de comprendre ce qui s'est passé à la ligne du dessus ;)
    N.B. Quand un message d'erreur indique "...on line 80..." : merci de regarder à cette ligne, et de nous la montrer :
    • avec les lignes AU-DESSUS (car l'erreur peut être avant)
    • ou là, en l’occurrence, en faisant un var_dump($_SESSION['searchForm'][$col]); puisqu'on cherche un index "type" qui semble ne pas exister.
    Dernière modification par Invité ; 29/09/2015 à 16h18.

  9. #9
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(!empty(array_filter($_SESSION['searchForm'][$col])))// <-- ligne 80
    il n'y a pas ce code dans ce que je t'ai proposé.
    par contre tu mis le implode dans la boucle alors qu'il va a l'exterieur.

  10. #10
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    226
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 226
    Points : 119
    Points
    119
    Par défaut
    Merci à vous pour vos réponses, j'ai réussi à identifier le problème.
    Le test avec var_dump proposé par jreaux62 m'a mis la puce à l'oreille, j'obtenais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    array(0) { [0]=> string(25) "(Array BETWEEN 0 AND 100)
    Mon erreur venait de la déclaration de mon array.
    J'avais fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $iso[] = array("a1","a2","a3","a4","p1","p2","p3","p4","p5");
    au lieu de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $iso = array("a1","a2","a3","a4","p1","p2","p3","p4","p5");
    J'avais donc un array d'array j'imagine, ce qui ne lui plaisait pas quand on lui donnait en index.

    Merci et bonne journée.

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

Discussions similaires

  1. Récupération d'un array dans un autre array
    Par slake13 dans le forum Langage
    Réponses: 1
    Dernier message: 14/10/2009, 17h09
  2. Recherche d'index dans list ou array
    Par mister2502 dans le forum Général Python
    Réponses: 3
    Dernier message: 02/04/2009, 21h40
  3. Javascript, array et index
    Par sietjp dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 08/11/2006, 18h45
  4. [Tableaux] passer un array d'une page à une autre
    Par 18Marie dans le forum Langage
    Réponses: 5
    Dernier message: 25/06/2006, 23h42
  5. Réponses: 21
    Dernier message: 20/06/2006, 17h49

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