Добавить и контролировать, если строка содержит символ в строке x позиции [рекурсивно] - PullRequest
0 голосов
/ 08 сентября 2011

у меня такая ситуация:

$asd = "Hey hello world!";

Теперь я хотел бы знать, как я могу рекурсивно (если не существует) добавлять (каждые 3 символа) символ (например, "J") ... при разборе строки слева направо?

так что результаты будут:

$asd = "HeyJ heJlloJ woJrldJ!";

Ответы [ 2 ]

1 голос
/ 08 сентября 2011

Как насчет:

$str = "Hey hello world!";
for($i=3; $i<strlen($str); $i+=4) {
    if ($str[$i] != 'J')
        $str = substr_replace($str, 'J', $i, 0);
}
echo $str,"\n";

Вывод:

HeyJ heJlloJ woJrldJ!
1 голос
/ 08 сентября 2011

Вы можете сделать это так:

if(substr($asd, 3, 1) !== 'J')
{
    $asd = substr($asd, 0, 3)."J".substr($asd, 3);

}

Если вы точно не знаете, что строка $ asd длиннее трех символов, вам также следует проверить длину строки перед:

if(strlen($asd) > 3 && substr($asd, 3, 1) !== 'J')
{
    $asd = substr($asd, 0, 3)."J".substr($asd, 3);
}

Наконец, вышеописанный метод хорошо работает как для отдельных символов, так и для нескольких последовательностей символов, но если вам нужен только один символ, вы можете просто использовать индекс строки, чтобы проверить, есть ли символ, например:

if(strlen($asd) > 3 && $asd[3] !== 'J')
{
    $asd = substr($asd, 0, 3)."J".substr($asd, 3);
}

Если вам нужно делать это каждые 3 символа, просто поместите это в цикл:

$pos = 0;
while(true)
{
    // go to the position of the next character of interest
    $pos += 3;

    // if the next pos is past the end of the string break out of the loop
    if(strlen($asd) <= $pos)
        break;

    if($asd[$pos] !== 'J')
    {
       $asd = substr($asd, 0, $pos)."J".substr($asd, $pos);
       $pos++;
    }
}

Примечание

Если строка, которую вы редактируете таким образом, велика, и число вхождений, которые необходимо изменить, также довольно велико, вы можете оптимизировать алгоритм так, чтобы он сначала находил позиции, в которые необходимо вставить символы, а затем разбивает оригинал строка в массив подстрок, а затем объединяет их все вместе, используя управляющий символ в качестве соединителя, используя array_join

...