2016-09-07 2 views
0

Я пытаюсь оценить содержимое массива. Массив содержит температуру воды, представленную пользователем.PHP, оценивающий содержимое массива

Пользователь подает 2 темперы, один для горячей воды и один для холодной воды.

Что мне нужно, чтобы оценить оба элемента массива, чтобы найти, находятся ли они в пределах, пределы «Горячая вода: от 50 до 66», «Холодная вода меньше 21».

Если горячая или холодная неисправность выдает флаг проверки статус «1» или если оба они передают флаг проверки «0».

Ниже приведен код, я работаю с:

$row_WaterTemp['HotMin'] = "50"; 
$row_WaterTemp['Hotmax'] = "66"; 

$SeqWaterArray new(array); 

$SeqWaterArray = array("58", "21"); 


foreach($SeqWaterArray as $key => $val) { 
    $fields[] = "$field = '$val'"; 
    if($key == 0) { 
     if($val < $row_WaterTemp['HotMin'] || $val > $row_WaterTemp['Hotmax']) { 
      $Status = 1; 
      $WaterHot = $val; 
     } else { 
      $Status = 0; 
      $WaterHot = $val; 
     } 

    } 

    if($key == 1) { 
     if($val > $row_WaterTemp['ColdMax']) { 
      $Status = 1; 
      $WaterCold = $val; 
     } else { 
      $Status = 0; 
      $WaterCold = $val; 
     } 
    } 

} 

Мой вопрос:

При запуске сценария ключ массива (0) работает, но когда ключ массива (1) является evaluted флаг состояния для ключа (1) переопределяет флаг состояния для key0. Если кто-то может помочь, это будет здорово. Большое спасибо за ваше время.

+0

И ваш вопрос? –

+0

Извините, забыли задать вопрос. Теперь у меня есть. – DCJones

+0

Добавить '$ row_WaterTemp ['ColdMax'] = ...' на ваш вопрос? Что это делает? '$ SeqWaterArray new (array);'? должно быть: '$ SeqWaterArray = array();'? Могу ли я предложить включить «ошибки отображения» - см. Http: // stackoverflow.com/questions/1053424/how-do-i-get-php-errors-to-display –

ответ

0

Кажется ОК для меня, кроме мазута для значений в пределе, и вы можете упростить

$row_WaterTemp['HotMin'] = "50"; 
$row_WaterTemp['Hotmax'] = "66"; 

$SeqWaterArray = array("58", "21"); 
$Status = array() ; 

foreach($SeqWaterArray as $key => $val) { 
    if($key == 0) { 
     $Status = ($val >= $row_WaterTemp['HotMin'] && $val <= $row_WaterTemp['Hotmax']) ; 
     $WaterHot = $val; 
    } else if($key == 1) { 
     $Status += ($val >= $row_WaterTemp['ColdMax']) ; 
     $WaterCold = $val; 
    } 
} 

Если один выходит из строя, $Status = 1, если два испытания провалились, $Status = 2, если это нормально, $Status = 0.

0
<?php 

// this function return BOOL (true/false) when the condition is met 
function isBetween($val, $min, $max) { 
    return ($val >= $min && $val <= $max); 
} 

$coldMax = 20; $hotMin = 50; $hotMax = 66; 

// I decided to simulate a test of more cases: 
$SeqWaterArray['john'] = array(58, 30); 
$SeqWaterArray['martin'] = array(34, 15); 
$SeqWaterArray['barbara'] = array(52, 10); 

foreach($SeqWaterArray as $key => $range) { 
    $flag = array(); 
    foreach($range as $type => $temperature) { 
     // here we fill number 1 if the temperature is in range 
     if ($type == 0) { 
      $flag['hot'] = (isBetween($temperature, $hotMin, $hotMax) ? 0 : 1);  
     } else { 
      $flag['cold'] = (isBetween($temperature, 0, $coldMax) ? 0 : 1);  
     }     
    } 
    $results[$key]['flag'] = $flag;     
} 

var_dump($results); 

?> 

Это результат:

["john"]=> 
    "flag"=> 
     ["hot"]=> 1 
     ["cold"]=> 0 
["martin"]=> 
    "flag" => 
     ["hot"]=> 1 
     ["cold"]=> 0 
["barbara"]=> 
    "flag" => 
     ["hot"]=> 0 
     ["cold"]=> 0 
+0

.. и что случилось с проверкой на холодную воду? – simon

+0

Да, вы испытываете обе температуры, но только в том, находятся ли они в пределах горячей воды. Если вы посмотрите на код OPs, вы заметите, что есть проверка на ограничение холодной воды. – simon

+0

Лучше взгляните на вопрос OPs или его код. Ваша функция проверяет, находится ли температура между 55 и 66 для ** обоих ** значений. Но OP хочет, чтобы вторая температура была проверена против предела холодной воды. – simon

0

Вы можете использовать заявление перерыв в этом случае, когда флаг устанавливается в 1. В соответствии с вашей спецификации холодной воды должна быть не менее 21, Я изменил код.

<?php 

$row_WaterTemp['HotMin'] = "50"; 
$row_WaterTemp['Hotmax'] = "66"; 
$row_WaterTemp['ColdMax'] = "21"; 

$SeqWaterArray = array("58", "21"); 


foreach($SeqWaterArray as $key => $val) { 
    $fields[] = "$key = '$val'"; 
    if($key == 0) { 
     if($val < $row_WaterTemp['HotMin'] || $val > $row_WaterTemp['Hotmax']) { 
      $Status = 1; 
      $WaterHot = $val; 
      break; 
     } else { 
      $Status = 0; 
      $WaterHot = $val; 
     } 

    } 
if($key == 1) { 
    if($val >= $row_WaterTemp['ColdMax']) { 
     $Status = 1; 
     $WaterCold = $val; 
     break; 
    } else { 
     $Status = 0; 
     $WaterCold = $val; 
    } 
} 

} 
echo $Status; 

?>

Таким образом, было бы легче разорвать петлю в случае, если температура не может находиться в пределах диапазона, в любом случае.

https://eval.in/636912

0

Я не думаю, что вам нужен foreach цикл здесь, так как вы работаете с простым массивом и, очевидно, вы знаете, что первый элемент является температура горячей воды, а второй элемент холодной воды температура. Я бы просто сделать что-то вроде этого:

$row_WaterTemp['HotMin'] = 50; 
$row_WaterTemp['HotMax'] = 66; 
$row_WaterTemp['ColdMax'] = 21; 

$SeqWaterArray = array(58, 21); 

$waterHot = $SeqWaterArray[0]; 
$waterCold = $SeqWaterArray[1]; 

$status = 0; 

if ($waterHot < $row_WaterTemp['HotMin'] || $waterHot > $row_WaterTemp['HotMax']) { 
    $status = 1; 
} 
if ($waterCold > $row_WaterTemp['ColdMax']) { 
    $status = 1; 
} 

Вы можете комбинировать if заявления, конечно. Я отделил их из-за удобочитаемости.

Обратите внимание, что я удалил все цитаты из цифр. Цитаты предназначены для строк, а не для чисел.

Смежные вопросы