Using regex seems unnecessary here unless you need to perform fullstring validation.
It seems that you are only checking the static leading characters, so strpos()
is the most efficient call.
I am saving each found key instead of using a counter.
When the loop finishes, I extract the integer from the last key.
Code: (Demo)
$_POST = [
'wind_1' => 'hk',
'hamburger_66' => 'foo',
'wind_2' => 'pop',
'wind_25' => 'another'
];
foreach ($_POST as $k => $v) {
if (strpos($k, 'wind_') === 0) { // simple validatation
$key = $k; // overwrite previous qualifying key
}
}
echo filter_var($key, FILTER_SANITIZE_NUMBER_INT); // isolate the number
// or you could use str_replace('wind_', '', $key);
Or if you want to get a bit funky...
echo max(preg_replace('~^(?:wind_|.*)~', '', array_keys($_POST)));
This replaces all of the leading wind_
substrings OR the whole string, then plucks the highest value.
Demo
P.S. When you are anyone else ascends to PHP7.3 or higher, there is a wonderful function released (array_key_last())to access the last key of an array. (I'm assuming the keys are reliably structured/sorted.)
Code: (Demo)
$_POST = [
'wind_1' => 'hk',
'wind_2' => 'pop',
'wind_25' => 'another'
];
echo substr(array_key_last($_POST), 5);
// output: 25
After all of the above workarounds, I think the best advice would be to change the way you are coding your form fields. If you change the name
attribute from wind_#
to wind[#]
, you will create a wind
subarray within $_POST
and then you can access the number values without dissecting a string. (Demo)
echo array_key_last($_POST['wind']);
or (sub PHP7.3)
end($_POST['wind']);
echo key($_POST['wind']);