str_replace() Enforces Strings In Array Argument

str_replace() accepts an array of strings as third argument: it applies all the replacements to all the strings in that arguments.

Until PHP 8.0, it was possible to pass an array of arrays, and the inner arrays would be omitted in the replacement. In PHP 8.0, the inner arrays are cast to a string, aka Array and then, the replacements occurs.

This is also applicable to str_ireplace().

PHP code

<?php

var_dump(str_replace('a', 'b', [[]]));

class x {
     function __toString() {
             return 'def';
     }
}

var_dump(str_replace('a', 'b', [new x]));

?>

Before

array(1) {
  [0]=>
  array(0) {
  }
}
array(1) {
  [0]=>
  object(x)#1 (0) {
  }
}

After

PHP Warning:  Array to string conversion in /codes/str_replaceOnArraysOfThings.php on line 3

Warning: Array to string conversion in /codes/str_replaceOnArraysOfThings.php on line 3
array(1) {
  [0]=>
  string(5) Arrby
}
array(1) {
  [0]=>
  string(3) def
}

PHP version change

This behavior changed in 8.0