skip to Main Content

I have array of vars

array(2) {  
  ["M"]=>
  string(3) "500"
  ["MA"]=>
  string(3) "200"
}

AND strings "1000-M", "1000-MA", "1000+MA-M", "MA/2", "M*MA+100"

And I need to replace M with value 500, and MA with value 200. When I use str_replace it works but only for M, because it still match with first var M

Thanks for help

2

Answers


  1. You can use preg_replace_callback() function to match the variable names using regex.

    foreach ($strings as &$str) {
      $str = preg_replace_callback('/b(M|MA)b/', function ($matches) use ($array) {
        return $array[$matches[1]];
      }, $str);
    }
    
    Login or Signup to reply.
  2. You can sort your replace array by longest keyword first, so that it will be replaced first, and only later on replace shorter keys:

    $strings = ["1000-M", "1000-MA", "1000+MA-M", "MA/2", "M*MA+100"];
    
    $replace = ['M' => '500', 'MA' => '200'];
    
    krsort($replace);
    
    foreach ($strings as $str) {
        echo $str . ':' . str_replace(array_keys($replace), $replace, $str) . PHP_EOL;
    }
    
    // 1000-M => 1000-500
    // 1000-MA => 1000-200
    // 1000+MA-M => 1000+200-500
    // MA/2 => 200/2
    // M*MA+100 => 500*200+100
    

    Example

    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search