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 :

Substituer des clé par leurs valeur dans une chaine


Sujet :

Langage PHP

  1. #1
    Rédacteur
    Avatar de marcha
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2003
    Messages
    1 571
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 571
    Points : 2 351
    Points
    2 351
    Par défaut Substituer des clé par leurs valeur dans une chaine
    Bonjour,

    J'ai un tableau avec des clés=>valeurs, du genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $x['nom'] = 'Moran';
    $x['prenom'] = 'Bob';
    J'ai une chaine du genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $a = "Votre nom est {nom} est votre prénom est {prenom}";
    J'aimerai une fonction qui substitue les valeurs, à la quelle je
    passe ma chaine et le tableau de clés=>valeurs, du genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $resultat = substitue($a, $x);
    Quel est selon vous la solution la plus performante ?

    merci,

    EDIT: $a n'est pas une chaine codé en dur :-)

  2. #2
    Membre émérite Avatar de Madfrix
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 326
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 326
    Points : 2 566
    Points
    2 566
    Par défaut
    Bonjour, je ferais quelque chose comme ca :

    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    function substitue($a, $x){
     
    	$nouvelle_chaine = $a;
    	preg_match_all('#{(.+)}#Usi', $a, $matches, PREG_SET_ORDER);
     
    	if(empty($matches))
    		return $a;
     
    	foreach($matches as $matche)
    		if(isset($x[$matche[1]]))
    			$nouvelle_chaine = str_replace($matche[0], $x[$matche[1]], $nouvelle_chaine);
    		else
    			return $a;
     
    	return $nouvelle_chaine;
     
    }
     
    $x['nom'] = 'Moran';
    $x['prenom'] = 'Bob';
     
    $a = "Votre nom est {nom} est votre prénom est {prenom}";
     
    echo substitue($a, $x);

  3. #3
    Membre habitué
    Inscrit en
    Décembre 2009
    Messages
    79
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 79
    Points : 152
    Points
    152
    Par défaut
    Dans ton cas je suggère tout simplement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    function substitue($a, $x) {
       foreach($x as $key => $value) {
          $x = str_replace("{".$key."}", $value, $x);
       }
       return $x;
    }

  4. #4
    Rédacteur
    Avatar de marcha
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2003
    Messages
    1 571
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 571
    Points : 2 351
    Points
    2 351
    Par défaut
    Merci pour vos propositions,

    J'ai fait quelques tests de perf, voici un code pour tester:

    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
     
    <?php
     
    	function substitue1($a, $x) {
     
    		$nouvelle_chaine = $a;
    		preg_match_all('#{(.+)}#Usi', $a, $matches, PREG_SET_ORDER);
     
    		if(empty($matches))
    			return $a;
     
    		foreach($matches as $matche)
    			if(isset($x[$matche[1]]))
    				$nouvelle_chaine = str_replace($matche[0], $x[$matche[1]], $nouvelle_chaine);
    			else
    				return $a;
     
    		return $nouvelle_chaine;
     
    	}
     
    	function substitue2($a, $x) {
    		foreach($x as $key => $value) {
    			$a = str_replace("{".$key."}", $value, $a);
    		}
    		return $a;
    	}
     
    	function substitue3($a, $x) {
    		$tokens = explode('{', $a);
    		$n = count($tokens);
    		for($i=1;$i<$n;$i++) {
    			list($var_name, $data) = explode('}', $tokens[$i]);
    			$tokens[$i] = $x[$var_name].$data;			
    		}
    		$r = implode('', $tokens);
    		return $r;
    	}
     
     
    	$x['nom'] = 'Moran';
    	$x['prenom'] = 'Bob';
    	for($i=0;$i<50;$i++) $x['key'.$i] = $i;
     
    	$a = "Votre nom est {nom} est votre prénom est {prenom}";
    	$a = str_repeat($a, 10);
    	$n = 1000;
     
    	$time = microtime();
    	for($i=0;$i<$n;$i++) {
    		$resultat = substitue1($a, $x);
    	}
    	$dur = microtime() - $time;
    	echo "1: ".$dur."<br>";
     
    	$time = microtime();
    	for($i=0;$i<$n;$i++) {
    		$resultat = substitue2($a, $x);
    	}
    	$dur = microtime() - $time;
    	echo "2: ".$dur."<br>";
     
    	$time = microtime();
    	for($i=0;$i<$n;$i++) {
    		$resultat = substitue3($a, $x);
    	}
    	$dur = microtime() - $time;
    	echo "3: ".$dur."<br>";
     
    ?>
    J'observe que la méthode de OlgarK est plus rapide si il y a peu
    de données dans le tableau $x (<5 ou <6 env.), mais elle ralenti
    fortement avec le nombre d'entrées dans $x.

    Merci Madfrix pour la version regexp, j'avais même pas essayé car
    j'ai souvent été déçu des perfs.

    J'espérais en fait qu'il existait une fonction native en php pour ça

  5. #5
    Membre expert
    Avatar de ThomasR
    Homme Profil pro
    Directeur technique
    Inscrit en
    Décembre 2007
    Messages
    2 230
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2007
    Messages : 2 230
    Points : 3 972
    Points
    3 972
    Par défaut
    Bonjour,

    Il n'existe pas de fonctions native, mais une implémentation est proposée dans la doc de la fonction sprintf : http://fr.php.net/manual/fr/function.sprintf.php#94608

  6. #6
    Membre émérite Avatar de Madfrix
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 326
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 326
    Points : 2 566
    Points
    2 566
    Par défaut
    Voilà une autre fonction si tu veux

    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
     
    function substitue($a, $x) {
     
       $a_remplacer = array();
       $remplacements = array();
     
       foreach($x as $cle=>$valeur){
    		$a_remplacer[] = '{'.$cle.'}';
    		$remplacements[] = $valeur;
       }
     
       return  str_replace($a_remplacer, $remplacements, $a);   
     
    }

  7. #7
    Expert éminent sénior

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Points : 17 777
    Points
    17 777
    Par défaut
    Et preg_replace_callback plutôt que preg_match_all/str_replace ?
    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
    17
    18
    19
    20
    21
    function substitue($a, $x) {
        return preg_replace_callback('~\{([^}]+)\}~',
            function ($matches) use ($x) {
                if (isset($x[$matches[1]])) {
                    return $x[$matches[1]];
                } else {
                    return $matches[0];
                }
            },
            $a
        );
    }
     
    $x = array();
    $x['nom'] = 'Moran';
    $x['prenom'] = 'Bob';
     
    $a = "Votre nom est {nom} est votre prénom est {prenom}";
     
    $resultat = substitue($a, $x);
    var_dump($resultat);
    string(44) "Votre nom est Moran est votre prénom est Bob"
    (requiert PHP >= 5.3)

    Mais les implémentations ne manquent pas ... Une énième de str_replace :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    function substitue($a, $x) {
        return str_replace(
            array_map(function ($value) { return '{'.$value.'}'; }, array_keys($x)),
            array_values($x),
            $a
        );
    }

Discussions similaires

  1. remplacer une variable par sa valeur dans une chaine
    Par regis1_1 dans le forum Langage
    Réponses: 5
    Dernier message: 12/05/2013, 12h07
  2. Des problèmes pour ajouter valeur dans une ArrayList
    Par Fused dans le forum Collection et Stream
    Réponses: 4
    Dernier message: 07/11/2008, 16h28
  3. {VBA Excel} Colorier des cases selon la valeur dans une autre
    Par Thomas69 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 27/06/2008, 09h56
  4. Remplacer des cellules par leurs valeurs
    Par benoitbs dans le forum Excel
    Réponses: 1
    Dernier message: 28/01/2008, 11h21
  5. Réponses: 2
    Dernier message: 19/04/2007, 15h26

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