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 :

Utiliser array_map avec des arguments


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Homme Profil pro
    Ingénieur en électrotechnique retraité
    Inscrit en
    Décembre 2008
    Messages
    1 718
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur en électrotechnique retraité

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 718
    Par défaut Utiliser array_map avec des arguments
    Bonjour,

    Je n'arrive pas à utiliser array_map avec des arguments pour la fonction de rappel.
    Je souhaite remplacer cette boucle:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $echo['titles'] = [];
    foreach($post as $key=>$value) {
    	$echo['titles'][$key] = setTitle($value,27);
    }
    unset($key,$value);
    Par l'équivalent avec array_map. J'ai essayé ceci: var_dump(array_map('setTitle',$post,[$value,27]));

    Pour info, voici ma fonction de rappel:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    function setTitle($value,$max) {
    	if (empty($value)) return '';
    	return (grapheme_strlen($value) >$max) ? " title = '$value'": '';
    }
    EDIT: J'ai surtout essayé de m'inspirer de l'exemple #3 de la doc PHP mais sans succès.
    EDIT2: J'obtiens quelque chose d'approchant avec ceci: var_dump(array_map('setTitle',$post,array_fill(0,count($post),27)));, le seul souci étant que les clés du $post ne sont pas conservées.

  2. #2
    Expert confirmé Avatar de Toufik83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2012
    Messages
    2 539
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 2 539
    Par défaut
    Bonjour,

    Je ne veux pas être chiant, mais je pense que je t'avais déjà expliqué Ici que array_map() n'est pas le bon choix pour ce cas.

    Une nouvelle solution consiste d'utiliser array_walk qui permettrait de modifier les valeurs du tableau original sans passer par une 2éme variable :
    Code php : 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
     
    $post=["post1"=>"valeur p1","post2"=>"valeur p2 dfgdshfg sdlfgjlsdkfjg sdfgjdsflg"];
     
    function setTitle(&$value,$key,$prefix,$max=27) {
    	$value=strlen($value) <$max ? '' :"$prefix'$value'";
    }
    array_walk($post,'setTitle',"title=");
    var_dump($post);
    /*Affiche : 
      array(2) {
      ["post1"]=>
      string(0) ""
      ["post2"]=>
      string(48) "title='valeur p2 dfgdshfg sdlfgjlsdkfjg sdfgjdsflg'"
    }
    */
    NOTE la référence & à côté de &$value, c'est expliqué dans la documentation de array_walk.

    Le seul problème avec array_walk() c'est qu'elle n'accepte que 3 paramètres et pas plus, c'est pour cette raison que j'ai mis $max=27 dans les paramètres de setTitle(), mais on peut l'éviter si on passe la 3éme variable de array_walk en tant que tableau :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    function setTitle(&$value,$key,$data) {
    	$value=strlen($value) <$data[1] ? '' :"$data[0]'$value'";
    }
    array_walk($post,'setTitle',["title=",27]);//là le $data de setTitle est un array, dans lequel on met le prefix "title=" et la valeur de $max
    var_dump($post);
    /*Affiche : 
      array(2) {
      ["post1"]=>
      string(0) ""
      ["post2"]=>
      string(48) "title='valeur p2 dfgdshfg sdlfgjlsdkfjg sdfgjdsflg'"
    }
    */

  3. #3
    Membre éprouvé
    Homme Profil pro
    Ingénieur en électrotechnique retraité
    Inscrit en
    Décembre 2008
    Messages
    1 718
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur en électrotechnique retraité

    Informations forums :
    Inscription : Décembre 2008
    Messages : 1 718
    Par défaut
    OK, merci. Finalement je reste sur l'idée de la boucle.

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

Discussions similaires

  1. Lancer un programme avec des arguments via IE...
    Par petozak dans le forum Général Conception Web
    Réponses: 6
    Dernier message: 24/03/2006, 12h51
  2. Peut on utiliser OR avec des jointures de tables??
    Par gins06 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 04/10/2005, 13h40
  3. Impossible d'utiliser DISTINCT avec des types image et ntext
    Par azlinch dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 17/08/2005, 18h43
  4. Utiliser MySqlAdmin avec des droits utilisateurs sur XP
    Par thorgal85 dans le forum Outils
    Réponses: 2
    Dernier message: 18/03/2005, 13h19
  5. Réponses: 6
    Dernier message: 24/02/2005, 10h44

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