<?php
function key_values($key) {
if ($key[0] == '>') {
[$lower, $upper] = [substr($key, 1), 'INF'];
}
else {
[$lower, $upper] = explode('-', $key);
}
return [$lower, $upper];
}
function convert_slabs($slabs) {
$bounds = array();
$last_value = reset($slabs);
[$lb, $ub] = [$lower, $upper] = key_values(key($slabs));
while ($value = next($slabs)) {
[$lower, $upper] = key_values(key($slabs));
// new entry required?
if ($value != $last_value) {
$bounds[] = (object)['lb' => $lb, 'ub' => $ub, 'value' => $last_value];
[$lb, $ub] = [$lower, $upper];
$last_value = $value;
}
else {
// no, just extend the upper bound
$ub = $upper;
}
}
// add the last object
$bounds[] = (object)['lb' => $lb, 'ub' => $ub, 'value' => $last_value];
return $bounds;
}
$slabs_array = array(
[ '0-300' => 2.5, '300-500' => 2.5, '500-1000' => 2.5, '1000-5000' => 2.4, '>5000' => 2.4 ],
[ '0-300' => 1.2, '300-500' => 1.2, '500-1000' => 1.2, '1000-5000' => 1.3, '>5000' => 1.4 ],
[ '0-300' => 2.5, '300-500' => 2.5, '500-1000' => 2.5, '1000-5000' => 2.5, '>5000' => 2.5 ],
[ '0-300' => 4.5, '300-500' => 2.5, '500-1000' => 2.5, '1000-5000' => 2.5, '>5000' => 3.5 ],
[ '0-300' => 4.5, '300-500' => 3.5, '500-1000' => 3.5, '1000-5000' => 3.5, '>5000' => 3.5 ],
[ '0-300' => 1.5, '300-500' => 2.5, '500-1000' => 2.5, '1000-5000' => 2.5, '>5000' => 1.5 ],
[ '0-300' => 1.5, '300-500' => 2.5, '500-1000' => 3.5, '1000-5000' => 2.5, '>5000' => 3.5 ],
[ '0-300' => 1.5, '300-500' => 2.5, '500-1000' => 2.5, '1000-5000' => 1.5, '>5000' => 1.5 ]
);
foreach ($slabs_array as $slabs) {
$result = convert_slabs($slabs);
echo str_replace('},{', "},\n{", json_encode($result)) . PHP_EOL . PHP_EOL;
}
preferences:
23.43 ms | 410 KiB | 5 Q