与对象的值相比,PHP创建了唯一的值

时间:2018-08-22 18:57:14

标签: php arrays object unique

我需要为$ total创建一个唯一值,以不同于接收到的对象的所有其他值。它应该将total与来自对象的order_amount进行比较,如果相同,则应将其值增加0.00000001,然后再次检查该对象以查看其是否再次与另一个order_amount匹配。最终结果应该是一个唯一值,与起始$ total值相比增加的幅度很小。所有值均设置为8个小数位。

我尝试了以下操作,但无法获得所需的结果。我在做什么错了?

function unique_amount($amount, $rate) {

    $total = round($amount / $rate, 8);
    $other_amounts = some object...;

    foreach($other_amounts as $amount) {
        if ($amount->order_amount == $total) {
            $total = $total + 0.00000001;
        }
    }

    return $total;
}

2 个答案:

答案 0 :(得分:1)

<?php

define('EPSILON',0.00000001);
$total = 4.00000000;
$other_amounts = [4.00000001,4.00000000,4.00000002];

sort($other_amounts);

foreach($other_amounts as $each_amount){
    if($total === $each_amount){ // $total === $each_amount->order_amount , incase of objects
        $total += EPSILON;
    }
}

var_dump($total);

输出

float(4.00000003)

如果break,您可以添加一个额外的$total < $each_amount,以使其效率更高。

更新

要基于$other_amountsamount中的对象进行排序,可以使用usort

usort($other_amounts,function($o1,$o2){
    if($o1->order_amount < $o2->order_amount ) return -1;
    else if($o1->order_amount > $o2->order_amount ) return 1;
    return 0;
});

答案 1 :(得分:0)

好的,这是我想出的解决方案。首先,我创建了一个函数来提供具有随机总数的随机对象,这样我就可以使用它,这对您来说不必要,但对于此测试有用:

function generate_objects()
{
    $outputObjects = [];

    for ($i=0; $i < 100; $i++) {
        $object = new \stdClass();

        $mainValue = random_int(1,9);
        $decimalValue = random_int(1,9);

        $object->order_amount = "{$mainValue}.0000000{$decimalValue}";

        $outputObjects[] = $object;
    }

    return $outputObjects;
}

现在对于解决方案部分,首先是代码,然后是解释:

function unique_amount($amount, $rate) {
    $total = number_format(round($amount / $rate, 8), 4);

    $searchTotal = $total;
    if (strpos((string) $searchTotal, '.') !== false) {
        $searchTotal = str_replace('.', '\.', $searchTotal);
    }

    $other_amounts = generate_objects();

    $similarTotals = [];
    foreach($other_amounts as $amount) {
        if (preg_match("/^$searchTotal/", $amount->order_amount)) {
            $similarTotals[] = $amount->order_amount;
        }
    }

    if (!empty($similarTotals)) {
        rsort($similarTotals);

        $total = ($similarTotals[0] + 0.00000001);
    }

    // DEBUG
    //echo '<pre>';
    //$vars = get_defined_vars();
    //unset($vars['other_amounts']);
    //print_r($vars);
    //die;

    return $total;
}

$test = unique_amount(8,1);

echo $test;

我决定使用RegEx查找以我提供的金额开头的金额。由于在练习中我仅在最后一个十进制情况下提供了带有1-9的整数,所以我跟踪了它们并将它们添加到一个数组$similarTotals中。

然后我对该数组进行排序,如果不为空,则按值降序,得到第一项,并递增0.00000001。

因此,最后,返回数组中的$ total(假定未找到任何内容)或递增的第一项。

PS。我没想到这段代码会这么大,但是,好吧...

您可以在此处查看测试:https://3v4l.org/WGThI