I have a measurand like 55.9 mm and I want to divide it in different gauge blocks. Just like: 55.9 mm = 1.4 mm + 1.5 mm + 50 mm + 3 mm
But it can happen that I don't have the 1.4 gauge block. So I need to use something like:
55.9 mm = 1.44 mm + 1.46 mm + 50 mm + 3 mm
As you see i have to substitute the 1.4 and 1.5 gauge blocks.
I am wrinting a PHP-script that calculates which possible gauge blocks I can use, based on the available gauge blocks.
How is it possible to check, wich gauge block with two decimal places replaces a gauge block with one decimal place.
The available blocks are stored in an array.
Here is the complete code:
<?php
function decimalPlaces($number) {
$str = strval($number);
$pos = strrpos($number, '.');
return ($pos===false ? 0 : strlen($str)-$pos-1);
}
function gaugeBlocks($measurement, $em0, $em1, $em2, $em3){
if($measurement == 0){
return;
}
$dp = decimalPlaces($measurement);
$gauge = array();
if($dp == 3){
foreach($em3 as $em){
$newMeasurement = round($measurement, 3) - $em;
if(decimalPlaces($measurement - $em) == 2){
echo "Neuer Messwert: ".$newMeasurement." nach Abzug des Endmasses: ".$em."<br />";
$gauge[] = $em;
if($newMeasurement == 0){
echo "HELL NO 3";
}else{
gaugeBlocks($newMeasurement, $em0, $em1, $em2, $em3);
}
}
}
}
if($dp == 2){
$splitDec = explode(".", round($measurement, 2));
$zielEM = floatval("1.".$splitDec[1]);
if($zielEM < 1.50){
foreach($em2 as $em){
if($em == $zielEM){
$newMeasurement = round($measurement, 2)-$em;
echo "Neuer Messwert: ".$newMeasurement." nach Abzug des Endmasses: ".$em."<br />";
if(decimalPlaces($newMeasurement) == 1 || decimalPlaces($newMeasurement) == 0){
$gauge[] = $em;
if($newMeasurement == 0){
echo "HELL NO 2";
}else{
gaugeBlocks($newMeasurement, $em0, $em1, $em2, $em3);
}
}
}else{
$lastDigitMeasurement = floatval(substr($measurement, -1));
$lastDigitEM = floatval(substr($em, -1));
if($lastDigitEM == $lastDigitMeasurement){
$newMeasurement = round($measurement, 2)-$em;
echo "Neuer Messwert: ".$newMeasurement." nach Abzug des Endmasses: ".$em."<br />";
if(decimalPlaces($newMeasurement) == 1 || decimalPlaces($newMeasurement) == 0){
$gauge[] = $em;
if($newMeasurement == 0){
echo "HELL NO 2";
}else{
gaugeBlocks($newMeasurement, $em0, $em1, $em2, $em3);
}
}
}
}
}
}else{
$nextEM = $zielEM-0.5;
foreach($em2 as $em){
if($em == $nextEM){
echo "da noch?";
$newMeasurement = round($measurement, 2)-$em;
echo "Neuer Messwert: ".$newMeasurement." nach Abzug des Endmasses: ".$em."<br />";
if(decimalPlaces($newMeasurement) == 1 || decimalPlaces($newMeasurement) == 0){
$gauge[] = $em;
if($newMeasurement == 0){
echo "HELL NO 2";
}else{
gaugeBlocks($newMeasurement, $em0, $em1, $em2, $em3);
}
}
}
}
}
}
if($dp == 1){
$splitDec = explode(".", round($measurement, 1));
$zielEM = floatval("1.".$splitDec[1]);
if($zielEM <= 1.5){
foreach($em1 as $em){
if($em == $zielEM){
$newMeasurement = round($measurement, 1)-$em;
echo "Neuer Messwert: ".$newMeasurement." nach Abzug des Endmasses: ".$em."<br />";
if(decimalPlaces($newMeasurement) == 1 || decimalPlaces($newMeasurement) == 0){
$gauge[] = $em;
if($newMeasurement == 0){
echo "HELL NO 2";
}else{
gaugeBlocks($newMeasurement, $em0, $em1, $em2, $em3);
}
}
}else{
$lastDigitMeasurement = floatval(substr($measurement, -1));
$lastDigitEM = floatval(substr($em, -1));
if($lastDigitEM == $lastDigitMeasurement){
$newMeasurement = round($measurement, 1)-$em;
echo "Neuer Messwert: ".$newMeasurement." nach Abzug des Endmasses: ".$em."<br />";
if(decimalPlaces($newMeasurement) == 1 || decimalPlaces($newMeasurement) == 0){
$gauge[] = $em;
if($newMeasurement == 0){
echo "HELL NO 2";
}else{
gaugeBlocks($newMeasurement, $em0, $em1, $em2, $em3);
}
}
}
}
}
}else{
$nextEM = $zielEM-0.5;
foreach($em1 as $em){
if($em == $nextEM){
$newMeasurement = round($measurement, 1)-$em;
echo "Neuer Messwert: ".$newMeasurement." nach Abzug des Endmasses: ".$em."<br />";
if(decimalPlaces($newMeasurement) == 1 || decimalPlaces($newMeasurement) == 0){
$gauge[] = $em;
if($newMeasurement == 0){
echo "HELL NO 2";
}else{
gaugeBlocks($newMeasurement, $em0, $em1, $em2, $em3);
}
}
}else{
$lastDigitMeasurement = floatval("2.".substr($measurement, -1));
//Solve problem here...
}
}
}
}
if($dp == 0){
foreach($em0 as $em){
$em = round($em, 0);
$newMeasurement = round($measurement, 0) - $em;
if($newMeasurement >= 0){
echo "Neuer Messwert: ".$newMeasurement." nach Abzug des Endmasses: ".$em."<br />";
$gauge[] = $em;
gaugeBlocks($newMeasurement, $em0, $em1, $em2, $em3);
}
if($newMeasurement == 0){
exit;
}
}
}
return;
}
echo "<a href='menu.php'>Zurück</a><br />";
echo "<br />";
echo $_POST["mass"];
echo "<br />";
$tray = array();
if($_POST["halle"] == 1){
$tray = ["W7", "W8"];
}
if($_POST["halle"] == 2){
$tray = ["W4", "W10"];
}
$em3 = ["1.005"];
$em2 = array();
$em1 = array();
$em0 = array();
$wert = 1;
$em1 = [0.5];
$em0[] = $wert;
while($wert<1.5){
$wert = $wert+0.01;
if(decimalPlaces($wert) == 2){
$em2[] = $wert;
}else{
$em1[] = $wert;
}
}
$wert = 1.5;
while($wert<25){
$wert = $wert+0.5;
if(decimalPlaces($wert) != 0){
$em1[] = $wert;
}else{
$em0[] = $wert;
}
}
$wert = 25;
while($wert<100){
$wert = $wert+25;
$em0[] = $wert;
}
/*
* Alle Möglichen Stückelungen mit vorhandenen Maßen
*/
$measurement = floatval(str_replace(',', '.', $_POST['mass']));
$usedBlocks = array();
$em3 = array_reverse($em3);
foreach(array_keys($em3) as $em){
$em3[$em] = round($em3[$em], 3);
}
$em2 = array_reverse($em2);
foreach(array_keys($em2) as $em){
$em2[$em] = round($em2[$em], 2);
if(($em2[$em] == 1.37)){
unset($em2[$em]);
}
}
$em1 = array_reverse($em1);
foreach(array_keys($em1) as $em){
$em1[$em] = round($em1[$em], 1);
if(($em1[$em] == 1.4)){
unset($em1[$em]);
}
}
$em0 = [100, 75, 50, 25, 24, 23, 22, 21, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 2, 1];
foreach(array_keys($em0) as $em){
$em0[$em] = round($em0[$em], 0);
}
$usedBlocks[] = gaugeBlocks($measurement, $em0, $em1, $em2, $em3);
?>
array {1.41, 1.42, 1.43, 1.44, 1.45, 1.46, 1.47, 1.48, 1.49, 1.5, ...}how can I check which combinations eqal 2.9, e. g.: 2.9 = 1.41 + 1.49 or 2.9 = 1.42 + 1.48 ...