PHP str_replace с циклом for из массива - PullRequest
0 голосов
/ 14 ноября 2009

Хорошо, у меня есть str_replace, и я хочу взять значения из массива и взять следующий фрагмент, чтобы заменить слово «собака». В общем, я хочу, чтобы $ string читалось:

"Утка ела кошку, а свинья ела шимпанзе"

<?php
$string = 'The dog ate the cat and the dog ate the chimp';
$array = array('duck','pig');
for($i=0;$i<count($array);$i++) {
    $string = str_replace("dog",$array[$i],$string);
}
echo $string;
?>

Этот код просто возвращает:

"Утка съела кота, а утка съела шимпанзе"

Я пробовал несколько вещей, но ничего не работает. У кого-нибудь есть идеи?

Ответы [ 5 ]

5 голосов
/ 14 ноября 2009

Редактировать: Извините за ошибочный ответ ранее. Это сделает это. Нет str_replace, нет preg_replace, просто сырье, быстрый поиск и объединение строк:

<?php
$string = 'The dog ate the cat and the dog ate the chimp';
$array = array('duck', 'pig');
$count = count($array);
$search = 'dog';
$searchlen = strlen($search);
$newstring = '';
$offset = 0;
for($i = 0; $i < $count; $i++) {
    if (($pos = strpos($string, $search, $offset)) !== false){
        $newstring .= substr($string, $offset, $pos-$offset) . $array[$i];
        $offset = $pos + $searchlen;
    }
}
$newstring .= substr($string, $offset);
echo $newstring;
?>

p.s. Ничего страшного в этом примере, но вы должны держать count() вне цикла. Если он у вас есть, он выполняется на каждой итерации и выполняется медленнее, чем просто один раз вызвать его заранее.

2 голосов
/ 14 ноября 2009
<?php
$string = 'The dog ate the cat and the dog ate the chimp';
$array = array('duck', 'pig');

$count = count($array);

for($i = 0; $i < $count; $i++) {
    $string = preg_replace('/dog/', $array[$i], $string, 1);
}

echo $string;
?>

утка съела кошку, а свинья съела шимпанзе

1 голос
/ 14 ноября 2009

После того, как первая итерация вашего цикла for $ string заменит оба вхождения dog на duck, и следующие итерации ничего не сделают.

Я не могу придумать более элегантный способ решения этой проблемы, и я надеюсь, что есть что-то более простое:

<?php

$search = 'The dog ate the cat and the dog ate the chimp';
$replacements = array('duck','pig');
$matchCount = 0;
$replace = 'dog';

while(false !== strpos($search, $replace))
{
  $replacement = $replacements[$matchCount % count($replacements)];
  $search = preg_replace('/('.$replace.')/', $replacement, $search, 1);
  $matchCount++;
}

echo $search;
0 голосов
/ 14 ноября 2009

Использование substr_replace();

<?php
function str_replace_once($needle, $replace, $subject)
{
    $pos = strpos($subject, $needle);
    if ($pos !== false)
        $subject = substr_replace($subject, $replace, $pos, strlen($needle));
    return $subject;
}

$subject = 'The dog ate the cat and the dog ate the chimp';
$subject = str_replace_once('dog', 'duck', $subject);
$subject = str_replace_once('dog', 'pig', $subject);

echo $subject;
?>
0 голосов
/ 14 ноября 2009

еще один вариант

 $str = 'The dog ate the cat and the dog ate the chimp';
 $rep = array('duck','pig');
 echo preg_replace('/dog/e', 'array_shift($rep)', $str);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...