Ikinci dizi değerleri ile ilk dizide dizeleri yerine

4 Cevap php

Nedense ben bu ile mücadele ediyorum.

Ben şu 2 diziler var ve ben $ img diziden dizi değerlerini almak ve böylece gibi,% img_ etiketlerini değiştirerek / ekleyerek, $ metin diziye sırayla onları eklemek gerekir:

$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");

Ben $ metin dizisi şöyle bitirmek istiyorum:

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

NOT: $ img dizinin eleman sayısı değişir ama her zaman $ metin dizisindeki% img_ sayısı olarak aynı olacaktır.

4 Cevap

İşte bunu tek bir yol kullanmak için $ img dizisindeki yedek dize izleme ayrıntıları tamamlamayı bir sınıf ile preg_replace_callback kullanarak bulunuyor:

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);

Için başka bir sürümü php 5.3 bir anonymous function ve bazı kullanarak + 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);

Burada başka bir yolu:

<?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);

Hangi çıkışlar:

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

OOP iyidir. D: İşte benim olmayan-OOP biridir

$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);

Bunu grup bir işleve sizin gibi eğer.

Umarım bu yardımcı olur.