[Array et =>] problème de compréhension et d'application

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : [Array et =>] problème de compréhension et d'application

par spirou » 14 févr. 2006, 18:12

Merci, mais comme ça, ça ne fonctionne pas.

J'ai essayé en mettant 2 valeurs dans le array de $type_filtre.
$type_filtre = array('filtre1', 'filtre5');
$liste_filtre = 
array(
'filtre1' => IMG_FILTER_NEGATE,
'filtre2' => IMG_FILTER_GRAYSCALE,
'filtre3' => IMG_FILTER_GAUSSIAN_BLUR,
'filtre4' => IMG_FILTER_BRIGHTNESS,
'filtre5' => IMG_FILTER_CONTRAST,
'filtre6' => IMG_FILTER_EMBOSS,
'filtre7' => IMG_FILTER_MEAN_REMOVAL
);

/*foreach($liste_filtre as $element => $nom_filtre)
{
    if(in_array($element, $type_filtre))
    {           
        imagefilter($img, $nom_filtre);                    
    }
}*/
foreach($type_filtre as $element)
{ // pour chaque nom de filtre reçu
   echo $liste_filtre[$element] . "<br />"; // affiche la valeur associée
}
Et ça m'affiche 0 et 3.

Je me demande d'ailleurs pourquoi 3 pour le 5ème, ça devrait être 4 :shock:

Y'a encore un truc que j'ai pas dû bien saisir...

par Ryle » 14 févr. 2006, 17:43

Dans ton exemple, tu parcours chaque élément de ton tableau associatif et si tu trouves cet élément dans la liste des filtres que tu as reçu, tu l'affiches :
foreach($liste_filtre as $element => $nom_filtre) { // pour chaque couple cle => valeur
    if(in_array($element, $type_filtre)) { // si la clé est contenue dans le tableau récupéré : affiche la valeur associé
        echo $nom_filtre . "<br>"; 
    } 
} 
Normalement tu peux le faire plus simplement en bouclant juste sur le tableau récupéré :
foreach($type_filtre as $element) { // pour chaque nom de filtre reçu
   echo $liste_filtre[$element]; // affiche la valeur associée
}
Peut être est ce que ce sera plus clair comme ça, et en principe ça devrait fonctionner (tes 0, 1, 2.. me paraissent assez bizare ;))

par spirou » 14 févr. 2006, 16:55

J'avais essayé comme tu dis, en mettant $liste_filtre[$element], mais ça me retournait les valeurs numériques de chaque tour du foreach (0, 1, 2, ..).

D'ailleurs, j'ai essayé tout un tas de combinaison possible, et je suis enfin parvenu à ce que je souhaites, un coup de chance :mrgreen:

J'ai transformé comme ça :
foreach($liste_filtre as $element => $nom_filtre)
{
    if(in_array($element, $type_filtre))
    {            
        echo $nom_filtre . "<br>";
    }
}
Et ça m'affiche bien le nom de mes filtres.

Bon, j'ai pas tout compris :oops:
Mais au moins ça fonctionne. 8)

Merci à tous :P

par Ryle » 14 févr. 2006, 16:41

array_values te retourne en fait un tableau composé uniquement des valeurs de ton tableau initiale. (array_keys fait de même juste avec les clés)

Pour venir lire un tableau associatif, il suffit simplement de lire l'élément associé à la clé : $monTableau[$maCle] affichera la valeur associée à $maCle dans $monTableau

Dans ton exemple, si tu appelles $liste_filtre[$element] il te retournera directement 'IMG_FILTER_NEGATE' si $element est égal à "filtre1" :)

par spirou » 14 févr. 2006, 16:20

Merci :P

En effet, Ryle, c'est avec array_keys qu'il fallait que je compare.

Maintenant, j'arrive à tester ma condition, mais je n'arrive pas à afficher la valeur avec array_values.

J'ai transformé mon code comme ceci :
foreach($type_filtre as $element => $nom_filtre)
{
    //echo $nom_filtre . "<br>";
    //echo array_values($liste_filtre) . "<br>";
    if(in_array($nom_filtre, array_keys($liste_filtre)))
    {                  
        echo $nom_filtre . "<br>";
        echo array_values($liste_filtre) . "<br>";
    }
}
Mes array_values($liste_filtre), m'affiche array, et je ne comprends pas pourquoi :?

Tictac, j'ai essayé avec ton code, mais j'ai une erreur qui me dit :

Wrong datatype for second argument

Sur cette ligne :
$array_ok = in_array($type_filtre,$liste_filtre[$i]);

par Tictac » 14 févr. 2006, 15:58

hello , je pense que le probleme vient du fait que tu fais ça =>

if(in_array($type_filtre, $liste_filtre))

tu devrais faire une boucle pour checker pour chaque valeur de $liste_filtre

=>
$nb_filtre = sizeof($liste_filtre)

for($i=0 ; $i < $nb_filtre ; $i++)
     {
      $array_ok = in_array($type_filtre,$liste_filtre[$i]);
     //si la valeur est dans l'array 
     if ($array_ok === true)
         {
          //Afficher la valeur presente dans l'array 
          print $liste_filtre[$i];
         }
     }

par Ryle » 14 févr. 2006, 15:33

Ca ne serait pas plutôt dans array_keys qu'il faudrait chercher ton élément ?

le tableau est de la forme "clé => valeur" si c'est bien "filtre1", ... que tu récupères de tes checkbox, alors c'est dans les clé que tu dois regarder pour le retrouver et en déduire la valeur associée :)

(enfin si j'ai tout bien compris de ce que tu voulais faire :))

par Invité » 14 févr. 2006, 15:13

pcq c'est comme ca, alors tu vois l

[Array et =>] problème de compréhension et d'application

par spirou » 14 févr. 2006, 14:43

Salut à tous !!!

Voilà, j'ai un formulaire avec plusieurs checkbox à cocher (nbre indéfini), je souhaite donc récupérer les valeurs sous forme d'une chaine, et ensuite affecter à la valeur du checkbox une valeur dans un array.

Mais je n'arrive pas à faire ce que je veux.
Voici ce que j'ai fait :

Le html :

Code : Tout sélectionner

<p> <label>Couleurs inversées</label> <input type="checkbox" name="type_filtre[]" value="filtre1" /> </p> <p> <label>Grayscale</label> <input type="checkbox" name="type_filtre[]" value="filtre2" /> </p> <p> <label>Gaussien</label> <input type="checkbox" name="type_filtre[]" value="filtre3" /> </p> <p> <label>Luminosité</label> <input type="checkbox" name="type_filtre[]" value="filtre4" /> </p> <p> <label>Contraste</label> <input type="checkbox" name="type_filtre[]" value="filtre5" /> </p> <p> <label>Relief</label> <input type="checkbox" name="type_filtre[]" value="filtre6" /> </p> <p> <label>Brouillée</label> <input type="checkbox" name="type_filtre[]" value="filtre7" /> </p>
Que je récupère donc dans mon PHP :
if($_POST['filtre'] == 'avec')
{
            $type_filtre = $_POST['type_filtre'];
            $liste_filtre = 
            array(
            'filtre1' => 'IMG_FILTER_NEGATE',
            'filtre2' => 'IMG_FILTER_GRAYSCALE',
            'filtre3' => 'IMG_FILTER_GAUSSIAN_BLUR',
            'filtre4' => 'IMG_FILTER_BRIGHTNESS',
            'filtre5' => 'IMG_FILTER_CONTRAST',
            'filtre6' => 'IMG_FILTER_EMBOSS',
            'filtre7' => 'IMG_FILTER_SELECTIVE_BLUR'
            );
            //print_r(array_values ($liste_filtre) );
            if(in_array($type_filtre, $liste_filtre))
            {
                echo array_values ($liste_filtre);
            }
}
            foreach($type_filtre as $element)
            {
                //echo $element;
                if(in_array($element, array_values($liste_filtre)))
                {
                    echo array_values($liste_filtre);
                }
            }
        }
Echo $element fonctionne bien, mais c'est la condition
if(in_array($element, array_values($liste_filtre)))
Que je n'arrive pas à faire.

Qu'est-ce qu'il faut mettre à la place de array_values($liste_filtre) ?
Car cette condition n'est jamais remplie.

J'ai aussi essayé avec array_keys, mais ça m'affiche array pour chaque valeur.

Si quelqu'un pouvait m'expliquer le pourquoi du comment.

Merci.