str replace - 替换x值

Assuming I have a string

$str="0000,1023,1024,1025,1024,1023,1027,1025,1024,1025,0000";

there are three 1024, I want to replace the third with JJJJ, like this :

output :

0000,1023,1024,1025,1024,1023,1027,1025,JJJJ,1025,0000

how to make str_replace can do it

thanks for the help

Here is what I would do and it should work regardless of values in $str:

function replace_str($str,$search,$replace,$num) {
    $pieces = explode(',',$str);
    $counter = 0;
    foreach($pieces as $key=>$val) {
        if($val == $search) {
            $counter++;
            if($counter == $num) {
                $pieces[$key] = $replace;
            }
        }
    }
    return implode(',',$pieces);
}

$str="0000,1023,1024,1025,1024,1023,1027,1025,1024,1025,0000";

echo replace_str($str, '1024', 'JJJJ', 3);

I think this is what you are asking in your comment:

function replace_element($str,$search,$replace,$num) {
    $num = $num - 1;
    $pieces = explode(',',$str);
    if($pieces[$num] == $search) {
        $pieces[$num] = $replace;
    }
    return implode(',',$pieces);
}
$str="0000,1023,1024,1025,1024,1023,1027,1025,1024,1025,0000";
echo replace_element($str,'1024','JJJJ',9);

strpos has an offset, detailed here: http://php.net/manual/en/function.strrpos.php

So you want to do the following:

1) strpos with 1024, keep the offset

2) strpos with 1024 starting at offset+1, keep newoffset

3) strpos with 1024 starting at newoffset+1, keep thirdoffset

4) finally, we can use substr to do the replacement - get the string leading up to the third instance of 1024, concatenate it to what you want to replace it with, then get the substr of the rest of the string afterwards and concatenate it to that. http://www.php.net/manual/en/function.substr.php

You can either use strpos() three times to get the position of the third 1024 in your string and then replace it, or you could write a regex to use with preg_replace() that matches the third 1024.

if you want to find the last occurence of your string you can used strrpos

Here's a solution with less calls to one and the same function and without having to explode, iterate over the array and implode again.

// replace the first three occurrences
$replaced = str_replace('1024', 'JJJJ', $str, 3);
// now replace the firs two, which you wanted to keep
$final = str_replace('JJJJ', '1024', $replaced, 2);

As your question asks, you want to use str_replace to do this. It's probably not the best option, but here's what you do using that function. Assuming you have no other instances of "JJJJ" throughout the string, you could do this:

$str = "0000,1023,1024,1025,1024,1023,1027,1025,1024,1025,0000";
$str = str_replace('1024','JJJJ',$str,3)
$str = str_replace('JJJJ','1024',$str,2);

Do it like this:

$newstring = substr_replace($str,'JJJJ', strrpos($str, '1024'), strlen('1024') );

See working demo