I have the following value in a variable:
$var = M000000017590;
obtained from:
$DATO = "P000001759000_M000000017590_MSG1TRANSACCIONEXITOSA _MSG2 CONMILLA,"; $porciones = explode("_", $DATO); $var = $porciones[2];
I need to start sweeping from left to right and when I find the first non-zero number that from there saves the value in a variable, for example:
M000000017590 = 17590
A str_replace
does not help me and replacing the 0 with ""
since inside the last string it can also contain 0, some help?
Advertisement
Answer
In PHP strings are byte arrays, you can leverage on that
<?php $DATO = "P000001759000_M000000017590_MSG1TRANSACCIONEXITOSA _MSG2 CONMILLA,"; $num_detected = false; $buffer = ''; for($i=0; $i<strlen($DATO); $i++) { //start if( intval($DATO[$i]) > 0 ) $num_detected = true; //middle if($num_detected) $buffer .=$DATO[$i]; //stop if($num_detected && !intval($DATO[$i])) break; } echo $buffer; ?>
You start reading chars from your string one-by-one and check whether its numeric value holds for you or not. So as soon as you find a desired value(non-zero in your case) you start accumulating from thereon until you encounter an undesired value (zero/alpha in your case)
UPDATE: As mentioned by @waterloomatt if there are zeros embedded inside a valid sequence then the above algorithm fails. To fix this try
<?php function checkAhead($DATO, $i){ if(!isset($DATO[$i++])) return false; if(is_numeric($DATO[$i++])) return true; else return false; } $DATO = "P0000017590040034340_M000000017590_MSG1TRANSACCIONEXITOSA _MSG2 CONMILLA,"; $num_detected = false; $buffer = ''; for($i=0; $i<strlen($DATO); $i++) { //start if( intval($DATO[$i]) > 0 ) $num_detected = true; //middle if($num_detected) $buffer .=$DATO[$i]; //stop if($num_detected && ( !checkAhead($DATO, $i) )) break; } echo $buffer; ?>