php数组\u udiff用于将数组值与阈值(公差)进行比较

php数组\u udiff用于将数组值与阈值(公差)进行比较,php,arrays,Php,Arrays,我需要比较数据库值和post值。如果POST值(十进制价格)在2美分阈值之内,则考虑值相等。结果是具有“实”差的数组。数组是一致的:相同数量的值,相同的键 $db_values = array( "21" => 10.00, "22" => 20.00, "25" => 3.55); $post_values = array( "21" => 9.98, "22" => 20.01, "25" => 2.55 ); 我试图将绝对值与容差值进行比较——

我需要比较数据库值和post值。如果POST值(十进制价格)在2美分阈值之内,则考虑值相等。结果是具有“实”差的数组。数组是一致的:相同数量的值,相同的键

$db_values =   array( "21" => 10.00, "22" => 20.00, "25" => 3.55);
$post_values = array( "21" => 9.98,  "22" => 20.01, "25" => 2.55 ); 
我试图将绝对值与容差值进行比较——epsilon()和array_udiff:

function epsilon_compare ($v1,$v2)
{
 $epsilon = 0.02;
 $diff = abs($v1 - $v2);

   if ($diff <= $epsilon) 
    { 
            return 0;
      //echo "numbers are equal";
      } else {
         return 1;
             }
    }

 print_r(array_udiff($post_values, $db_values, "epsilon_compare"));
在这种情况下,它给出:

   Array ( [21] => 8 [22] => 20.01 [25] => 2.55 ) 
键[22]=>20.01已列出,但它在阈值内,因此不应在结果集中。
我想我还没有完全理解数组的含义。谢谢。

我不认为udiff能做你认为它能做的事。如果打印v1和v2,它将为您提供以下信息:

v1: 20.01 v2: 9.98
v1: 2.55 v2: 20.01
v1: 20 v2: 10
v1: 3.55 v2: 20
v1: 9.98 v2: 10
v1: 9.98 v2: 20.01
v1: 20.01 v2: 20
v1: 20.01 v2: 2.55
v1: 2.55 v2: 3.55 
这比你想象的要多

您可能需要一段类似以下内容的代码:

function compare_arrays($array1, $array2){
    $result = array();
    foreach($array1 as $value => $outcome){
        if(epsilon_compare($array1[$value], $array2[$value])){
            $result[$value] = $array2[$value];
        }
    }
    return $result;
}
:用户提供的回调函数用于比较。如果第一个参数被认为分别小于、等于或大于第二个参数,则它必须返回小于、等于或大于零的整数。如果元素不相等,则函数总是返回1,从而导致不同(错误)比较决策

<?php
function epsilon_compare ($v1,$v2)
{
    $epsilon = 0.02;
    $diff = $v1 - $v2;
    return abs($diff)<=$epsilon ? 0 : $diff;
}

$db_values =   array( "21" => 10.00, "22" => 20.00, "25" => 3.55);
$post_values = array( "21" => 8.00,  "22" => 20.01, "25" => 2.55 );
print_r(array_udiff($post_values, $db_values, "epsilon_compare"));

编辑:使用数组\u udiff\u assoc

$db_values = array ( "1" => 7.55, "2" => 5.45, "3" => 5.45, "4" => 64.45, "5" => 54.75, "6" => 30.40, "7" => 56.99, "8" => 10.90, "9" => 60.85, "11" => 3.25, "12" => 13.05, "13" => 5.45, "14" => 8.00, "15" => 5.45, "16" => 13.05, "17" => 4.35 );
$post_values = array ( "1" => 7.55, "2" => 5.45, "3" => 5.45, "4" => 64.45, "5" => 54.75, "6" => 30.40, "7" => 56.99, "8" => 10.90, "9" => 60.85, "11" => 3.25, "12" => 13.05, "13" => 2.45, "14" => 8.00, "15" => 5.45, "16" => 12.05, "17" => 2.34 );
print_r(array_udiff_assoc($post_values, $db_values, "epsilon_compare"));
印刷品

Array
(
    [21] => 8
    [25] => 2.55
)
Array
(
    [13] => 2.45
    [16] => 12.05
    [17] => 2.34
)

如果颠倒传递到array_udif的数组的顺序,会发生什么?(即,使用($db\u值,$post\u值,“epsilon\u compare”)调用它)。如果您得到不同的结果,它可能暗示“epsilon_compare”发生了一些有趣的事情。首先,compare fn不应该返回布尔值。“整数小于、等于或大于零”。当使用我的“epsilon_compare”函数时,它会给出错误(未定义的偏移量)。当测试VolkerK解决方案时,我会得到不一致的结果。如果你能帮我让它工作的话,这可能是一种方法。我已经更正了关联数组的结果。如果数组中存在多个关联,请添加以下内容:If(isset($result[$value])array_push($result[$value],$array2[$value]);关于丹尼斯的评论,你认为“udiff”可以做更多的比较,这在本例中是需要的吗?
$db\u values=array(“1”=>7.55,“2”=>5.45,“3”=>5.45,“4”=>64.45,“5”=>54.75,“6”=>30.40,“7”=>56.99,“8”=>10.90,“9”=>60.85,“11”=>3.25,“12”=>13.05,“13”=>5.45,“14”=>8.00,“15”=>5.45,“16”=>17.05” => 4.35 );
$post_values=array(“1”=>7.55,“2”=>5.45,“3”=>5.45,“4”=>64.45,“5”=>54.75,“6”=>30.40,“7”=>56.99,“8”=>10.90,“9”=>60.85,“11”=>3.25,“12”=>13.05,“13”=>2.45,“14”=>8.00,“15”=>5.45,“16”=>12.05,“17”=>2.34)如果您使用以上两个数组,结果是不正确的(只有16=>12.05)。这就是数组的工作原理
返回一个数组,该数组包含任何其他参数中不存在的所有array1值。
对于其他结果,您必须指定/解释规则…我需要按键比较数组值。所以,第一个数组中键“17”的值与第二个数组中键“17”的值相对,而不是任何其他值。在这种情况下,foreach循环可能会更好。到目前为止,我一直在测试
udiff\u assoc
工作正常。我改变了这一行:`返回abs($diff)
Array
(
    [13] => 2.45
    [16] => 12.05
    [17] => 2.34
)