user3704920
user3704920

Reputation: 615

PHP Replacing Character Inside String With Variable

In few words, I am trying to replace all the "?" with the value inside a variable and it doesn't work. Please help.

    $string = "? are red ? are blue";
    $count = 1;

    update_query($string, array($v = 'violets', $r = 'roses'));


    function update_query($string, $values){

        foreach ( $values as $val ){

            str_replace('?', $val, $string, $count);    
        }

        echo $string;
    }

The output I am getting is: ? are red ? are blue

Upvotes: 0

Views: 1266

Answers (6)

Sverri M. Olsen
Sverri M. Olsen

Reputation: 13283

You can solve this in two ways:

1) Substitute the question marks with their respective values. There are a hundred ways one could tackle it, but for something like this I prefer just doing it the old-fashioned way: Find the question marks and replace them with the new values one by one. If the values in $arr contain question marks themselves then they will be ignored.

function update_query($str, array $arr) {
    $offset = 0;
    foreach ($arr as $newVal) {
        $mark = strpos($str, '?', $offset);
        if ($mark !== false) {
            $str = substr($str, 0, $mark).$newVal.substr($str, $mark+1);
            $offset = $mark + (strlen($newVal) - 1);
        }
    }
    return $str;
}
$string = "? are red ? are blue";
$vars = array('violets', 'roses');
echo update_query($string, $vars);

2) Or you can make it easy on yourself and use unique identifiers. This makes your code easier to understand, and more predictable and robust.

function update_query($str, array $arr) {
    return strtr($str, $arr);
}
echo update_query(':flower1 are red :flower2 are blue', array(
    ':flower1' => 'violets',
    ':flower2' => 'roses',
));

You could even just use strtr(), but wrapping it in a function that you can more easily remember (and which makes sense in your code) will also work.

Oh, and if you are planning on using this for creating an SQL query then you should reconsider. Use your database driver's prepared statements instead.

Upvotes: 0

user3704920
user3704920

Reputation: 615

Ok guys here is the solution from a combination of some good posts.

$string = "? are red ? are blue";

update_query($string, array($v = 'violets', $r = 'roses'));

function update_query($string, $values){

    foreach ( $values as $val ){

        $string = preg_replace('/\?/', $val, $string, 1);

    }

    echo $string;
}

As mentioned, preg_replace will allow limiting the amount of matches to update. Thank you all.

Upvotes: 0

Hmmm
Hmmm

Reputation: 1764

This is the best and cleanest way to do it

  <?php

  $string = "? are red ? are blue";
  $string = str_replace('?','%s', $string);
  $data = array('violets','roses');

  $string = vsprintf($string, $data);  

  echo $string;

Your code edited

$string = "? are red ? are blue";

update_query($string, array('violets','roses'));


function update_query($string, $values){

  $string = str_replace('?','%s', $string);
  $string = vsprintf($string, $values);

    echo $string;
}

Upvotes: 0

Niet the Dark Absol
Niet the Dark Absol

Reputation: 324710

Frustrated by people not paying attention, I am compelled to answer the question properly.

str_replace will replace ALL instances of the search string. So after violets, there will be nothing left for roses to replace.

Sadly str_replace does not come with a limit parameter, but preg_replace does. But you can actually do better still with preg_replace_callback, like so:

function update_query($string, $values){
    $result = preg_replace_callback('/\?/', function($_) use (&$values) {
        return array_shift($values);
    }, $string);
    echo $string;
}

Upvotes: 2

Larry Borsato
Larry Borsato

Reputation: 394

You probably want to capture the return from str_replace in a new string and echo it for each replacement, and pass $count by reference.

   foreach ( $values as $val ){

        $newString = str_replace('?', $val, $string, &$count);    
        echo $newString;
   }

Upvotes: 0

dmikester1
dmikester1

Reputation: 1370

You forgot to set it equal to your variable.

$string = str_replace('?', $val, $string, $count); 

Upvotes: 0

Related Questions