Add char to each string element

Hi,

I have this:
$Str='test(4)-test(51)-test(9)-test(12)-test(33)-test(4)';
$something_here='';
foreach(explode('-',$Str) as $xx) {
            	$string1=(preg_replace("/\([0-9]\)/", $something_here, $xx));
}
echo $string1;

Open in new window

So as you can see I need to replace elements inside brackets if there's just one digit, more specifically, I want to add '0' (zero) before this digit. I just need $something_here var, but can't manage with that, please help. Or you can think about different way to do that.
I want this output:
test(04)-test(51)-test(09)-test(12)-test(33)-test(04)

Open in new window


Thanks.
LVL 8
ZadoAsked:
Who is Participating?

Improve company productivity with a Business Account.Sign Up

x
 
ZadoConnect With a Mentor Author Commented:
OK, done:

My solution (darren's script changed actually):
function addzero($matches) {
	if (strlen($matches)<6) {
		$matches= "0".$matches[0];
    	foreach(explode('(',$matches) as $yy) {
       		$matches=(preg_replace("/\(/", "", $matches));
        }
  	}
  	return '('.$matches;
}

foreach(explode('-',$Str) as $xx) {
	$string1=(preg_replace_callback("/\([0-9]\)/", "addzero", $Str));
}
echo $string1;

Open in new window


@n4r-c0m solution (corrected):
$string1=(preg_replace_callback("/\(([0-9])\)/","addzero2", $xx)); changed to
$string1=(preg_replace_callback("/\(([0-9])\)/","addzero2", $Str)); that's my fault, I gave it in question.
Plus move echo out from foreach loop.
function addzero2($m) {
        $m = $m[1];
        if (strlen($m)<2) {
            $m= "(0".$m.")";
        }
        return $m;
    }

    foreach(explode('-',$Str) as $xx) {
                    $string1=(preg_replace_callback("/\(([0-9])\)/","addzero2", $Str));
    }
	echo $string1;

Open in new window


Thanks a lot for your help.
0
 
pak_slmCommented:
Is there Number if test() is fixed, mean  in you string test() present 6 time?
0
 
ZadoAuthor Commented:
No, it could be any word or number there
0
Free Tool: Subnet Calculator

The subnet calculator helps you design networks by taking an IP address and network mask and returning information such as network, broadcast address, and host range.

One of a set of tools we're offering as a way of saying thank you for being a part of the community.

 
pak_slmCommented:
i mean count is fixed to 6 or vary.
0
 
darren-w-Connect With a Mentor Commented:
how about this:

replace this line to :

$string1=(preg_replace_callback("/\([0-9]\)/","addzero", $xx));

add this function:

function addzero($matches)
{
if (strlen($matches)<2){
$matches= "0".$matches;
}
return $matches;
}
0
 
ZadoAuthor Commented:
vary, it could be:
asdf(4)-0000000(51)-test1(09)-test2(12)-tesssst(33)-test(4)-12345(1)

Open in new window

but always hyphen separated and one or two digits in brackets
0
 
ZadoAuthor Commented:
Thanks darren-w-, I changed a bit your script and almost works, it adds zero before one digit, but changes this digit into 'Array' in output, that's the only problem.

function addzero($matches)
{
if (strlen($matches)<6){
$matches= "0".$matches;
}
return '('.$matches.')';
}

foreach(explode('-',$Str) as $xx) {
				$string1=(preg_replace_callback("/\([0-9]\)/", "addzero", $Str));
}
echo $string1;

Open in new window

It changes this:
test(4)-test(51)-test(9)-test(12)-test(33)-test(4)

Open in new window

into this:
test(0Array)-test(51)-test(0Array)-test(12)-test(33)-test(0Array)

Open in new window

but should be this:
test(04)-test(51)-test(09)-test(12)-test(33)-test(04)

Open in new window

0
 
ZadoAuthor Commented:
Ok, solution is closer here:

function addzero($matches)
{
if (strlen($matches)<6){
$matches= "0".$matches[0];
}
return $matches;
}

foreach(explode('-',$Str) as $xx) {
				$string1=(preg_replace_callback("/\([0-9]\)/", "addzero", $Str));
}
echo $string1;

Open in new window


Just need to move opening bracket before zero, it gives this output:
      

test0(4)-test(51)-test0(9)-test(12)-test(33)-test0(4)

Open in new window

0
 
n4r-c0mConnect With a Mentor Commented:
    function addzero($m) {
        $m = $m[1];
        if (strlen($m)<2) {
            $m= "(0".$m.")";
        }
        return $m;
    }

    $Str='test(4)-test(51)-test(9)-test(12)-test(33)-test(4)';
    $something_here='';
    foreach(explode('-',$Str) as $xx) {
                    $string1=(preg_replace_callback("/\(([0-9])\)/","addzero", $xx));
                    echo $string1;
    }

Open in new window

0
 
darren-w-Commented:
$Str='test(4)-test(51)-test(9)-test(12)-test(33)-test(4)';
$patterns=array();
$patterns[0] = "/\({1}[0-9]\)/";
$patternsr=array();
$patternsr[0] = "(0\${1}1)";
print preg_replace($patterns,$patternsr,$Str);

returns

test(01)-test(51)-test(01)-test(12)-test(33)-test(01)
0
 
darren-w-Commented:
oops thats wrong
0
 
darren-w-Commented:
Simplified this a little:

<?php
$Str='test(4)-test(51444)-test(9)-test(122)-test(33)-test(1)';
$patterns=array("/\(([0-9])\)/");
$patternsr=array("(0$1)");
print preg_replace($patterns,$patternsr,$Str);
?>

returns: test(04)-test(51444)-test(09)-test(122)-test(33)-test(01)

without callback
0
 
n4r-c0mCommented:
Great solution!
More simplify :) :

$Str='test(4)-test(51444)-test(9)-test(122)-test(33)-test(1)';
print preg_replace("/\(([0-9])\)/","(0$1)",$Str);

Open in new window

0
 
ZadoAuthor Commented:
Thanks for help :-)
0
 
ZadoAuthor Commented:
I found proper solution based on experts comments, I just changed a bit their scripts, but my comment presents actual solution.
Thanks.
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.