- Published on
PHP Recursive str_replace: replaceTree
- Authors

- Name
- Kevin van Zonneveld
- @kvz
Working with trees
When working with tree data structures you often need to craft them in different ways. PHP offers a lot of functions to change the shape of arrays, but often they only go 1 level deep. Trees can count an almost infinite number of levels. Hence we need recursive replacements for our beloved array & string functions.
replaceTree
replaceTree is the tree version of str_replace. It will recursively replace through an array of strings.
<?php
/**
* Recursive alternative to str_replace that supports replacing keys as well
*
* The following code block can be utilized by PEAR's Testing_DocTest
* <code>
* // Input //
* $settings = array(
* "Credits" => "@appname@ created by @author@",
* "Description" => "@appname@ can parse logfiles and store then in mysql",
* "@author@_mail" => "kevin@vanzonneveld.net"
* );
* $mapping = array(
* "@author@" => "kevin",
* "@appname@" => "logchopper"
* );
*
* // Execute //
* $settings = replaceTree(
* array_keys($mapping), array_values($mapping), $settings, true
* );
*
* // Show //
* print_r($settings);
*
* // expects:
* // Array
* // (
* // [Credits] => logchopper created by kevin
* // [Description] => logchopper can parse logfiles and store then in mysql
* // [kevin_mail] => kevin@vanzonneveld.net
* // )
* </code>
*
* @param string $search
* @param string $replace
* @param array $array
* @param boolean $keys_too
*
* @return array
*/
function replaceTree($search="", $replace="", $array=false, $keys_too=false)
{
if (!is_array($array)) {
// Regular replace
return str_replace($search, $replace, $array);
}
$newArr = array();
foreach ($array as $k=>$v) {
// Replace keys as well?
$add_key = $k;
if ($keys_too) {
$add_key = str_replace($search, $replace, $k);
}
// Recurse
$newArr[$add_key] = replaceTree($search, $replace, $v, $keys_too);
}
return $newArr;
}
?>
Legacy Comments (3)
These comments were imported from the previous blog system (Disqus).
This looks nice piece of code, specially when i have to edit a sentence having specific character sequences.
But would ve been better if recursive replace was part of inbuilt php functions itself.
Awesome function, solved my problem right away!
This is really awesome. PHP doesn\'t allow this as a inbuilt func, but to me its look generic enuf to be included in pHp6