2009-10-17 9 views
3

Pour une raison quelconque, je suis aux prises avec cela.Remplacer les chaînes du premier tableau par des valeurs du deuxième tableau

Je donne les résultats suivants 2 tableaux et je dois prendre les valeurs de tableau du tableau img $ et les insérer dans l'ordre dans le tableau de texte $, annexant/remplacer les% balises IMG_, comme ceci:

$text = array(
    0 => "Bunch of text %img_ %img_: Some more text blabla %img_", 
    1 => "More text %img_ blabla %img_" 
); 

$img = array("BLACK","GREEN","BLUE", "RED", "PINK"); 

Je veux que mon tableau de texte $ pour finir comme ceci:

$text = array(
    0 => "Bunch of text %img_BLACK %img_GREEN: Some moretext blabla %img_BLUE", 
    1 => "More text %img_RED blabla %img_PINK" 
); 

NOTE: le nombre d'éléments dans le tableau img $ variera, mais sera toujours le même que le nombre de% IMG_ dans le texte $ tableau.

Répondre

5

Voici une façon que vous pouvez le faire, en utilisant preg_replace_callback avec une classe pour envelopper les détails de suivi qui chaîne de remplacement dans votre tableau $ img à utiliser:

class Replacer 
{ 
    public function __construct($img) 
    { 
     $this->img=$img; 
    } 

    private function callback($str) 
    { 
     //this function must return the replacement string 
     //for each match - we simply cycle through the 
     //available elements of $this->img. 

     return '%img_'.$this->img[$this->imgIndex++]; 
    } 

    public function replace(&$array) 
    { 
     $this->imgIndex=0; 

     foreach($array as $idx=>$str) 
     { 
      $array[$idx]=preg_replace_callback(
       '/%img_/', 
       array($this, 'callback'), 
       $str); 
     } 
    } 
} 

//here's how you would use it with your given data 
$r=new Replacer($img); 
$r->replace($text); 
+0

agréable de voir OO solutions autour d'ici :) – Mark

+0

Ahh, merci Paul. Magnifiquement fait! M'a sauvé un tas de grattage de la tête. – k00k

1

OOP est bon. Voici mon un non-OOP: D

$text = array(
    0 => "Bunch of text %img_ %img_: Some more text blabla %img_", 
    1 => "More text %img_ blabla %img_" 
); 

$img = array("BLACK","GREEN","BLUE", "RED", "PINK"); 

$newtext = array(); 
$k = 0; 
$count = count($text); 
for($i = 0; $i < $count; $i++) { 
    $texts = split("%img_", $text[$i]); 
    $jtext = $texts[0]; 
    $subcount = count($texts); 
    for($j = 1; $j < $subcount; $j++) { 
     $jtext .= "%img_"; 
     $jtext .= $img[$k++]; 
     $jtext .= $texts[$j]; 
    } 
    $newtext[] = "$jtext\n"; 
} 

print_r($newtext); 

Vous pouvez regrouper cela à une fonction si vous le souhaitez.

Espérons que cela aide.

+0

Aussi utile NawaMan, merci. – k00k

+0

Notez que ['split()'] (http://php.net/split) a été déprécié à partir de PHP 5.3. –

1

est ici encore une autre façon:

<?php 

$text = array(
    0 => "Bunch of text %img_ %img_: Some more text blabla %img_", 
    1 => "More text %img_ blabla %img_" 
); 

$img = array("BLACK","GREEN","BLUE", "RED", "PINK"); 

foreach ($text as &$row) { 
     $row = str_replace("%img_", "%%img_%s", $row); 
     $row = vsprintf($row, $img); 
} 

print_r($text); 

qui sort:

Array 
(
    [0] => Bunch of text %img_BLACK %img_GREEN: Some more text blabla %img_BLUE 
    [1] => More text %img_BLACK blabla %img_GREEN 
) 
2

Une autre version pour php 5.3+ en utilisant un anonymous function et certains spl:

$text = array(
    "Bunch of text %img_ %img_: Some more text blabla %img_", 
    "More text %img_ blabla %img_" 
); 
$img = new ArrayIterator(array("BLACK","GREEN","BLUE", "RED", "PINK")); 
foreach($text as &$t) { 
    $t = preg_replace_callback('/%img_/', function($s) use($img) { 
     $rv = '%img_' . $img->current(); 
     $img->next(); 
     return $rv; 
    }, $t); 
} 

var_dump($text); 
+0

Ceci est similaire à la façon dont j'ai initialement attaqué le problème. Merci pour ce VolkerK. – k00k

Questions connexes