read the manual http://www.php.net/manual/en/ref.strings.php A comprehensive concatenation function, that works with array and strings <?php function str_cat() { $args = func_get_args() ; // Asserts that every array given as argument is $dim-size. // Keys in arrays are stripped off. // If no array is found, $dim stays unset. foreach($args as $key => $arg) { if(is_array($arg)) { if(!isset($dim)) $dim = count($arg) ; elseif($dim != count($arg)) return FALSE ; $args[$key] = array_values($arg) ; } } // Concatenation if(isset($dim)) { $result = array() ; for($i=0;$i<$dim;$i++) { $result[$i] = '' ; foreach($args as $arg) $result[$i] .= ( is_array($arg) ? $arg[$i] : $arg ) ; } return $result ; } else { return implode($args) ; } } ?> A simple example : <?php str_cat(array(1,2,3), '-', array('foo' => 'foo', 'bar' => 'bar', 'noop' => 'noop')) ; ?> will return : Array ( [0] => 1-foo [1] => 2-bar [2] => 3-noop ) More usefull : <?php $myget = $_GET ; // retrieving previous $_GET values $myget['foo'] = 'b a r' ; // changing one value $myget = str_cat(array_keys($myget), '=', array_map('rawurlencode', array_values($myget))) ; $querystring = implode(ini_get('arg_separator.output'), $myget)) ; ?> will return a valid querystring with some values changed. Note that <?php str_cat('foo', '&', 'bar') ; ?> will return 'foo&bar', while <?php str_cat(array('foo'), '&', 'bar') ; ?> will return array(0 => foo&bar) *t0russ at gmail dot com* 14-Jun-2005 05:38<http://www.php.net/manual/en/ref.strings.php#53834> to kristin at greenaple dot on dot ca: thanx for sharing. your function in recursive form proved to be slightly faster and it returns false (as it should) when the character is not found instead of number 0: <?php function strnposr($haystack, $needle, $occurance, $pos = 0) { return ($occurance<2)?strpos($haystack, $needle,$pos):strnposr($haystack ,$needle,$occurance-1,strpos($haystack, $needle, $pos) + 1); } ?>