如何使用PHP动态创建价格范围

时间:2014-02-25 11:07:20

标签: php range

如何从价格数组创建价格范围?假设我有这个持有价格的数组:

  Array ( [0] => 500 [1] => 500 [2] => 520 [3] => 540 [4] => 551 [5] => 599 [6] => 601 [7] => 601 [8] => 650 [9] => 681 [10] => 750 [11] => 750 [12] => 851 [13] => 871 [14] => 871 [15] => 900 [16] => 990 [17] => 999 [18] => 1101 [19] => 1130 [20] => 1149 [21] => 1151 [22] => 1278 [23] => 1300 [24] => 1460 ) 

最小值= 500,最大值为1460.我需要向用户显示:

[x] 500-750 (11)
[x] 750-1000 (8)
[x] 1000+ (7)

棘手的部分是,如果值达到1500或者超过1500以上的需求如下:

[x] 500-750 (11)
[x] 750-1000 (8)
[x] 1000-1500 (n)
[x] 1500+ (if more than 1500 but not reached 2000).

我们可以说1500是限制,但如果有1500美元和2000美元之间的价格和超过2000美元,如2300美元,2400美元,2499美元,2000美元+必须是限制。这将是这样的:

[x] 500-750 (11)
[x] 750-1000 (8)
[x] 1000-1500 (n)
[x] 1500-2000 (n)
[x] 2000$+ (n)

这将创建5个范围。正如你所看到的最低价格是500,但最低价格。价格可能是20美元或120美元,因此功能不得违反5范围规则。第一个范围可以是20 $ -750 $(n)。

当然最高价格可能不是1000美元+所以可能需要显示如下内容:

[x] 25-50 (11)
[x] 50-100(8)
[x] 100-200(n)
[x] 200-400(n)
[x] 400+ (n)

我希望我能做到这一点。有很多条件,我不知道功能的使用或范围像PHP中的功能。希望你能提供帮助:/

4 个答案:

答案 0 :(得分:2)

我根据我的问题的$ array元素创建了这个函数。

如果这是我的问题的一个很好的方法,请提出一些意见,如指出我的错误。

http://laravel.io/bin/VLJn这是输出。

private function createRange($array){
    sort($array);

    //Setting range limits.
    //Check if array has 5 digit number.
    $countDigitedNumbers = preg_grep('/\d{5}/',$array);
    if(count($countDigitedNumbers) > 3){
        $rangeLimits = array(0,1000,2500,5000,10000,15000,20000,25000);
    }else{
        $rangeLimits = array(0,50,250,500,1000,1500,2000,2500);
    }
    $ranges = array();

    for($i = 0; $i < count($rangeLimits); $i++){
        if($i == count($rangeLimits)-1){
            break;
        }
        $lowLimit = $rangeLimits[$i];
        $highLimit = $rangeLimits[$i+1];

        $ranges[$i]['ranges']['min'] = $lowLimit;
        $ranges[$i]['ranges']['max'] = $highLimit;

        foreach($array as $perPrice){
            if($perPrice >= $lowLimit && $perPrice < $highLimit){
                $ranges[$i]['values'][] = $perPrice;
            }
        }
    }
    return $ranges;
}

答案 1 :(得分:1)

就个人而言,我会用所需的范围定义一个阵列(在配置中或直接),因为你可能正在销售价值0.01美元的金属螺丝,同时还有一台制造金属螺丝的机器,价值1000美元(例如)。这样您就可以控制所有可能的价格范围。使用动态价格因素可能会有效,但如果您突然收到价值20000美元的商品,也可能会出错,我怀疑您将拥有这么多范围,您无法手动定义它们。 (在这里随意拉出叉子和火把)

这是一个例子。假设您有一系列价格。您可以像这样定义范围:

$prices = array(1, 5, 10, 25, 500, 100);
$price_ranges = array(250 => array(), 100 => array(), 10 => array(), 1 => array());
// edit to your liking

然后,您可以循环显示所有可用价格,将它们与可用范围进行比较,从顶部开始并转到底部。如果它适合,它就坐。

foreach ($prices as $price) {
    foreach ($price_ranges as $price_range_key => &$price_range_array) {
        if ($price >= $price_range_key) {
            $price_range_array[] = $price;
            break;
        }
    }
}

这将产生一个包含价格的每个范围(作为关键字)的精美数组。

var_dump($price_ranges);
array(4) {
  [250] =>
  array(1) {
    [0] =>
    int(500)
  }
  [100] =>
  array(1) {
    [0] =>
    int(100)
  }
  [10] =>
  array(2) {
    [0] =>
    int(10)
    [1] =>
    int(25)
  }
  [1] =>
  array(2) {
    [0] =>
    int(1)
    [1] =>
    int(5)
  }
}

我相信你可以想出如何获得每个项目的数量并相应地显示它们。通常你会将最后一项标记为250+或类似的东西。

干杯。

答案 2 :(得分:1)

我让它自动化了;我没有使用类,但很容易转换。

<?php
$prices=Array ( 500 , 500 , 520 , 540 , 551 , 599 ,601 ,601 , 650 ,681 ,750 ,750 ,851 , 871 , 871 , 900 , 990 , 999 , 1101 , 1130 , 1149 , 1151 , 1278 , 1300 , 1460 );

// round the highest price 
$lastElement=end($prices);
$highestPrice=round($lastElement, -2);
$minimumPrice=$prices[0];

$maxPRoductInRange=5;

$rangeChart=array();
$chart=array();

function calculateRange(){
global $highestPrice,$maxPRoductInRange ,$rangeChart, $prices,$minimumPrice, $chart;
// range list initialize
makeRangeChart($minimumPrice,$highestPrice,$rangeChart);


$count=count($rangeChart);

for($a=0;$a<$count;$a++){
    if(isset($rangeChart[$a+1])){
        $min=$rangeChart[$a];
        $max=$rangeChart[$a+1];
        $result=checkProductCount($min,$max,$prices);
        // if count bigger than $maxPRoductInRange create bigger rangeChart and call this function recursively
        if($result[0]>$maxPRoductInRange){
            //create bigger range chart
            makeRangeChart($min,$max,$rangeChart);
            calculateRange();
        } 

    }
}
}


function checkProductCount($min,$max,$priceList){
    global $chart;
    $count=0;
    $rest=0;

    foreach( $priceList as $price){
        if($price>=$min && $price<$max) { 
            $count++; 
        } else { $rest++; }

    }
    $chart[$min]=$count;

    return array($count,$rest);
}


function makeRangeChart($min=0,$max,&$rangeChart){
    $middleOfRange=($max+$min)/2;
    $rangeChart[]=$min;
    $rangeChart[]=$middleOfRange;
    $rangeChart[]=$max;
    $rangeChart=array_unique ($rangeChart);
    sort($rangeChart, SORT_NUMERIC );
}

function printChart(){
global $chart,$highestPrice;

$minPrices=array_keys($chart);
$count=count($minPrices);
$line='';
    for($a=0;$a<$count;$a++){
        $line.=$minPrices[$a];
        $line.=(isset($minPrices[$a+1]))?' - '.$minPrices[$a+1]:'+';
        $line.='('.$chart[$minPrices[$a]].')<br>';
    }
return $line;
}

calculateRange();
echo printChart();
?>

答案 3 :(得分:0)

$minprice = 500;

for($i=150; $i>0; $i--){
    if($minprice>150){
        if($minprice%150==0){
            $roundminprice = $minprice;
        }
    }else{
        $roundminprice = 0;
    }
    $minprice--;
}


$maxprice = 1460;

for($i=0; $i<150; $i++){
    if($maxprice>300){
        if($maxprice%150==0){
            $roundmaxprice = $maxprice;
        }
    }else{
        $roundmaxprice = 300;
    }
    $maxprice++;
}

echo "<br>Minimum Pice = ".$roundminprice;
echo "<br>Maximum Pice = ".$roundmaxprice;