Давно я не писал про php.
.
Так вот. Понадобилось мне ограничить количество замен производимых функцией str_replace.
.
Тут же была найдена функция preg_replace поддерживающая нужную функциональность, но она дико тормозила, выедала кучу памяти, короче – не подходила.
.
Немного погуглив я вернулся к документации и в комментариях обнуружил нужный мне велосипед:
<?php function getSingleReplaceCombinations($replace, $with, $inHaystack) { $splits = explode($replace, $inHaystack); $result = array(); for ($i = 1, $ix = count($splits); $i < $ix; ++$i) { $previous = array_slice($splits, 0, $i); $next = array_slice($splits, $i); $combine = array_pop($previous) . $with . array_shift($next); $result[] = implode($replace, array_merge($previous, array($combine), $next)); } return $result; } var_dump(getSingleReplaceCombinations("a", "x", "aba")); // result as mentioned above ?>
На выходе функция отдаёт массив со всеми возможными заменами.
Но, мне ведь нужна только одна замена, это решилось добавлением break в конце цикла:
function getSingleReplaceCombination($replace, $with, $inHaystack) { $splits = explode($replace, $inHaystack); $result = array(); for ($i = 1, $ix = count($splits); $i < $ix; ++$i) { $previous = array_slice($splits, 0, $i); $next = array_slice($splits, $i); $combine = array_pop($previous) . $with . array_shift($next); $result[] = implode($replace, array_merge($previous, array($combine), $next)); break; //remove this, for multiple replaces } return implode("",$result); }
Так же, я завернул return в implode, что бы на выходе была строка, а не массив.
Похожие записи:
января 5, 2012 at 20:29
mixed str_replace ( mixed $search , mixed $replace , mixed $subject [, int &$count ] )
какбы count
Если передан, то будет установлен в количество произведенных замен.
не понял смысла писать функцию))
mr.The: там же апмерсанд стоит! Мы, передав туда переменную, узнаем сколько замен было сделано, а не укажем сколько делать.
темболее можно гораздо короче
explode() => $arr[2] = “замена 3″; => implode()
mr.The: хм, как вариант.
января 6, 2012 at 14:57
а точно, на & не посмотрел