Numeric and percentage deadband calculation
I'm unclear about what is TRUE and what is FALSE (and how you interpret it).

Is it FALSE = when value is greater than previous by more than deadband?
    (i.e. value &gt; previous + deadband is NOT OK)
    (i.e. value &lt;= previous + deadband is OK)
That's how I did it below, but if you want the opposite, change the "&lt;" sign. 


I would change the two functions in one, and give an extra argument (true for numeric, false for percentage):

    function check_deadband($value,$previous,$deadband,$check_numeric) {
        if ($value &lt;= 0) {
            return false;
        }
        if ($check_numeric) {
           // numeric testing
            $difference=abs($previous-$value);
            return $difference &lt; $deadband;
            // ex. value: 74, previous: 70 =&gt; difference = 4
            // difference: 4 &lt; deadband: 3 =&gt; false, not ok
        } else {
            // percentage testing
            $percentage=abs(($value - $previous) * 100/$previous);
            return $percentage &lt; $deadband;
            // ex. v:111 p:100, (v-p)*100/p:11% &lt; 10% =&gt; false, not ok
        }
    }


You eliminated the previous=0 or previous=value cases in your example, but I didn't understand why (you can put them back).
I also not sure that your percentage formula is corect. If you want the difference in percentage, then (value-previous)*100/previous will give you the right answer. (ex. value = 10, previous=5 => percentage is 100 - correct!)
You can check the function with the following testing code:

    $numeric_deadband = 3;
    $percentage_deadband = 10;

    /// GENERATE RADNOM DATA ex. 5.000 rows
    $rows_nr=5000;
    $min=40;
    $max=80;
    for ($i=0; $i&lt;$rows_nr; $i++) {
        $numeric_set[]=array(
            "value"=&gt;rand($min,$max), 
            "previous" =&gt; rand(40,80));
        $percentage_set[]=array(
            "value"=&gt;rand($min,$max),
            "previous" =&gt; rand(40,80));
    }

    $time=microtime(true); // just for testing purposes
    foreach ($numeric_set as $row) {
        // check NUMERIC set
        // remove echos after testing
        echo "NUMERIC &gt;&gt; value: $row[value] vs previous :".
            "$row[previous] (deadband: $numeric_deadband) =&gt; ";
        echo check_deadband(
            $row["value"],
            $row["previous"],
            $numeric_deadband,
            true)
            ? "true" : "false";
        echo "&lt;br/&gt;";
    } unset($row);

    // CHECK time in miliseconds
    echo "&lt;p&gt;Checking deadband for NUMERIC ($rows_nr rows) took:".
        round((microtime(true)-$time)*1000)." miliseconds&lt;/p&gt;";

    $time=microtime(true);
    foreach ($percentage_set as $row) {
        // check PERCENTAGE set
        // remove echo after testing
        echo "PERCENTAGE &gt;&gt; value: $row[value] vs previous:".
        "$row[previous]  (deadband: $percentage_deadband) =&gt; ";
        echo check_deadband(
            $row["value"],
            $row["previous"],
            $percentage_deadband,
            false)
            ? "true" : "false";
        echo "&lt;br/&gt;";
    } unset($row);

    echo "&lt;p&gt;Checking deadband for PERCENTAGE ($rows_nr rows) took:".
        round((microtime(true)-$time)*1000)." miliseconds&lt;/p&gt;";


Hope this works. Feedback would be appreciated!

EDIT:
Changed the script to detect both above and below deadband changes.