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 :

Utilisation de str_replace sur des tableaux [PHP 7]


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé Avatar de renaud26
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2003
    Messages
    1 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2003
    Messages : 1 365
    Par défaut Utilisation de str_replace sur des tableaux
    Bonjour à tous,

    Mon but est de modifier tous les liens de champs text issus de ma BDD.
    Après mon tri je me retrouve avec 3 tableaux: les anciens liens ($links), les nouveaux liens ($new_links) et le texte ($chaine). Les clefs sont les ID des textes.
    Dans chaque texte, il peut y avoir plusieurs liens à changer :

    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
     
    Array
    (
        [3018] => Array
            (
                [0] => https://www.toto.com/401-osmoseur-rgnrateur-aqua-avanti-em.html
                [1] => https://www.toto.com/401-osmoseur-rgnrateur-aqua-avanti-em.html
                [2] => https://www.toto.com/401-osmoseur-rgnrateur-aqua-avanti-em.html
                [3] => https://www.toto.com/401-osmoseur-rgnrateur-aqua-avanti-em.html
                [4] => https://www.toto.com/401-osmoseur-rgnrateur-aqua-avanti-em.html
            )
     
        [3024] => Array
            (
                [0] => https://www.toto.com/1619-la-mdecine-nouvelle-germanique-livre-du-dr-ryke-geerd-hamer-1619.html
                [1] => https://www.toto.com/1521-la-cure-de-tous-les-herpes-hulda-clark-9780984112937.html
            )
     
    )
     
    Array
    (
        [3018] => Array
            (
                [0] => https://www.toto.com/401-osmoseur-rgnrateur-aqua-avanti-em.html?s=263322901
                [1] => https://www.toto.com/401-osmoseur-rgnrateur-aqua-avanti-em.html?s=263322901
                [2] => https://www.toto.com/401-osmoseur-rgnrateur-aqua-avanti-em.html?s=263322901
                [3] => https://www.toto.com/401-osmoseur-rgnrateur-aqua-avanti-em.html?s=263322901
                [4] => https://www.toto.com/401-osmoseur-rgnrateur-aqua-avanti-em.html?s=263322901
            )
     
        [3024] => Array
            (
                [0] => https://www.toto.com/1619-la-mdecine-nouvelle-germanique-livre-du-dr-ryke-geerd-hamer-1619.html?s=263322901
                [1] => https://www.toto.com/1521-la-cure-de-tous-les-herpes-hulda-clark-9780984112937.html?s=263322901
            )
    )
     
    Array
    (
    [3018] => Le texte 3018 qui contient les liens à remplacer
    [3024] => Le texte 3024 qui contient les liens à remplacer
    )
    Quand j'ai mes 3 tableaux, je fais un bête

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     
    foreach($chaines as $id=>$content){
    	$new_content[$id] = str_replace($links[$id], $new_links[$id], $content);
    }
    Mais le print_r du nouveau tableau sort n'importe quoi genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    https://www.toto.com/401-osmoseur-rgnrateur-aqua-avanti-em.html?s=263322901?s=263322901?s=263322901?s=263322901?s=263322901
    Pouvez-vous m'aider ?
    D'avance merci.

  2. #2
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2011
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2011
    Messages : 34
    Par défaut
    Bonjour,

    La boucle que tu essayes de passer ne permet pas de déterminer l'index des liens à remplacer.
    Voici ma correction :

    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
    $links = [
        3018 => [
            'https://www.toto.com/401-osmoseur-rgnrateur-aqua-avanti-em.html',
            'https://www.toto.com/401-osmoseur-rgnrateur-aqua-avanti-em.html',
            'https://www.toto.com/401-osmoseur-rgnrateur-aqua-avanti-em.html',
            'https://www.toto.com/401-osmoseur-rgnrateur-aqua-avanti-em.html',
            'https://www.toto.com/401-osmoseur-rgnrateur-aqua-avanti-em.html'
        ],
        3024 => [
            'https://www.toto.com/1619-la-mdecine-nouvelle-germanique-livre-du-dr-ryke-geerd-hamer-1619.html',
            'https://www.toto.com/1521-la-cure-de-tous-les-herpes-hulda-clark-9780984112937.html'
        ]
    ];
     
    $new_links = [
        3018 => [
            'https://www.toto.com/401-osmoseur-rgnrateur-aqua-avanti-em.html?s=263322901',
            'https://www.toto.com/401-osmoseur-rgnrateur-aqua-avanti-em.html?s=263322901',
            'https://www.toto.com/401-osmoseur-rgnrateur-aqua-avanti-em.html?s=263322901',
            'https://www.toto.com/401-osmoseur-rgnrateur-aqua-avanti-em.html?s=263322901',
            'https://www.toto.com/401-osmoseur-rgnrateur-aqua-avanti-em.html?s=263322901'
        ],
        3024 => [
            'https://www.toto.com/1619-la-mdecine-nouvelle-germanique-livre-du-dr-ryke-geerd-hamer-1619.html?s=263322901',
            'https://www.toto.com/1521-la-cure-de-tous-les-herpes-hulda-clark-9780984112937.html?s=263322901'
        ]
    ];
     
    $chaines = [
        3018 => 'Le texte https://www.toto.com/401-osmoseur-rgnrateur-aqua-avanti-em.html, https://www.toto.com/401-osmoseur-rgnrateur-aqua-avanti-em.html, https://www.toto.com/401-osmoseur-rgnrateur-aqua-avanti-em.html, 
                    https://www.toto.com/401-osmoseur-rgnrateur-aqua-avanti-em.html, https://www.toto.com/401-osmoseur-rgnrateur-aqua-avanti-em.html qui contient les liens à remplacer',
        3024 => 'Le texte https://www.toto.com/1619-la-mdecine-nouvelle-germanique-livre-du-dr-ryke-geerd-hamer-1619.html, https://www.toto.com/1521-la-cure-de-tous-les-herpes-hulda-clark-9780984112937.html qui contient les liens à remplacer'
    ];
     
    foreach ($links as $id => $linksById) {
        foreach ($linksById as $index => $link) {
            $chaines[$id] = str_replace($link, $new_links[$id][$index], $chaines[$id]);
        }
    }

  3. #3
    Membre Expert
    Avatar de Dendrite
    Femme Profil pro
    Développeuse informatique
    Inscrit en
    Juin 2008
    Messages
    2 129
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 59
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeuse informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2008
    Messages : 2 129
    Billets dans le blog
    8
    Par défaut
    Et pourquoi tu ne passerais pas par des requêtes SQL pour modifier des tables SQL avec une formule dans ce goût


    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    update table liens l
    inner join table nouveaux_liens nl on l.id=nl.id
    set l.lien=nl.lien

    Au préalable bien sûr, tu sauvegardes toute ta base ! Très important !
    Et pour qu'on t'aide il faudrait que tu nous donnes la structure de tes tables SQL et les explications et un petit jeu de données.
    PDO, une soupe et au lit !
    Partir de la fin est un bon moyen de retrouver son chemin. Bibi - 2020

  4. #4
    Membre éprouvé Avatar de renaud26
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2003
    Messages
    1 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2003
    Messages : 1 365
    Par défaut
    Bonjour,

    En fait ces liens sont disséminés dans un champ wp_content d'une table wp_post (un blog Wordpress). Avec des centaines d'autres liens. Donc si leur structure matche selon certains critères, je les remplace par les mêmes liens auxquels j'ajoute un ID d'affiliation du type ?s=xxxxxxxxx

    Voici comment je récupère les tableaux:
    1- Je récupère les contents
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $resultats = $wpdb->get_results("SELECT ID, post_content FROM wp_posts WHERE post_content != '' AND post_content LIKE '%www.toto.com%' AND post_content LIKE '%.html%'") ;
    2- Le traitement

    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
     
    foreach ($resultats as $row) {
     
    	$chaines[$row->ID] = $row->post_content;
     
    	$motif='#<a href="(.*?)"(.*?)>#is';
     
    	preg_match_all($motif,$chaine,$out,PREG_PATTERN_ORDER);
     
    	foreach ($out[1] as $link) {
    		if(strpos($link,'www.toto.com') && strpos($link, '.html')){
    			$links[$row->ID][] = $link;
    			$new_links[$row->ID][] = $link.'?s=263322901';
    		}
     
    	}	
     
    }
    3- Constitution du tableau final (tel que j'ai présenté dans mon 1er post) et affichage

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    foreach($chaines as $id=>$content){
    	$new_content[$id] = str_replace($links[$id], $new_links[$id], $content);
    }
    print_r($new_content);
    Mais peut-être n'est ce pas la bonne méthode ? J'ignorais qu'on pouvait faire ce traitement directement dans MySQL...

  5. #5
    Membre éprouvé Avatar de renaud26
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2003
    Messages
    1 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2003
    Messages : 1 365
    Par défaut
    Bonjour Sam__ et merci de ta réponse,

    En fait il y a des indices dans mes tableaux car pour chaque chaine il peut y avoir plusieurs liens à traiter.
    Je n'avais pas donné assez de précisions, j'ai donc publié un autre post dans ce sujet.

  6. #6
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2011
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Septembre 2011
    Messages : 34
    Par défaut
    Oui je me suis bien rendu compte qu'il y avait plusieurs liens à traiter pour chaque id.
    Tu trouvera dans ma réponse précédente la boucle corrigée te permettant de réaliser les remplacements.
    Il faut boucler sur les liens et non les chaînes car sinon impossible de déterminer le nombre de liens à remplacer.

    Enfin tu peux améliorer cette boucle avec une instruction SQL Update ou Replace pour enregistrer en BDD les modifications directement.

  7. #7
    Membre éprouvé Avatar de renaud26
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2003
    Messages
    1 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2003
    Messages : 1 365
    Par défaut
    Merci Sam__, je vais tester et je reviens.
    Bonne soirée.

    Edit:

    C'est carrément top ! Je te remercie beaucoup. Et oui je vais faire ma requête update dans ma boucle.

  8. #8
    Membre éprouvé Avatar de renaud26
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2003
    Messages
    1 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2003
    Messages : 1 365
    Par défaut
    Damned ! J'ai écrit trop vite !
    Si je fais un print_r($chaines) après les foreach de traitement, j'ai encore des liens du style
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    https://www.totocom/401-osmoseur-rgnrateur-aqua-avanti-em.html?s=263322901?s=263322901?s=263322901?s=263322901?s=263322901
    Bien sûr dans les chaines où il y a plusieurs liens identiques à remplacer...

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

Discussions similaires

  1. permutations/combinaisons sur des tableaux dynamiques
    Par pEAk230 dans le forum Langage
    Réponses: 5
    Dernier message: 19/04/2006, 13h18
  2. [Eval] Problème de boucle for sur des tableaux
    Par battle_benny dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 12/01/2006, 23h55
  3. [RegEx] utilisation de preg_replace sur des balises
    Par Kerod dans le forum Langage
    Réponses: 5
    Dernier message: 09/12/2005, 13h46
  4. Réponses: 2
    Dernier message: 19/08/2003, 18h04
  5. free sur des tableaux "a moitié dynamiques"
    Par barthelv dans le forum C
    Réponses: 4
    Dernier message: 31/07/2003, 15h30

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