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

如何使用PHP动态创建价格范围,php,range,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] =>

如何从价格数组创建价格范围?假设我有一个包含价格的数组:

  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)
[x] 500-750 (11)
[x] 750-1000 (8)
[x] 1000-1500 (n)
[x] 1500+ (if more than 1500 but not reached 2000).
[x] 25-50 (11)
[x] 50-100(8)
[x] 100-200(n)
[x] 200-400(n)
[x] 400+ (n)
棘手的部分是,如果值达到1500或超过1500,则需要如下所示:

[x] 500-750 (11)
[x] 750-1000 (8)
[x] 1000+ (7)
[x] 500-750 (11)
[x] 750-1000 (8)
[x] 1000-1500 (n)
[x] 1500+ (if more than 1500 but not reached 2000).
[x] 25-50 (11)
[x] 50-100(8)
[x] 100-200(n)
[x] 200-400(n)
[x] 400+ (n)
我们可以说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)
$prices = array(1, 5, 10, 25, 500, 100);
$price_ranges = array(250 => array(), 100 => array(), 10 => array(), 1 => array());
// edit to your liking
这将创建5个范围。正如你们所看到的,最低价格是500美元,但最低价格可能是20美元或120美元,所以函数不能违反5范围规则。第一个范围可以是20$-750$(n)

当然,最高价格可能不会超过1000美元,因此可能需要显示以下内容:

[x] 500-750 (11)
[x] 750-1000 (8)
[x] 1000+ (7)
[x] 500-750 (11)
[x] 750-1000 (8)
[x] 1000-1500 (n)
[x] 1500+ (if more than 1500 but not reached 2000).
[x] 25-50 (11)
[x] 50-100(8)
[x] 100-200(n)
[x] 200-400(n)
[x] 400+ (n)

我希望我能做到这一点。有很多条件,我不知道pow或类似范围的函数在php中的用法。希望您能提供帮助:/

我个人会去定义一个数组(在配置中或直接定义)和所需的范围,因为您可能销售价值0.01美元的金属螺钉,同时生产价值1000美元的金属螺钉的机器(例如)。这样你就可以控制所有可能的价格范围。使用动态价格因素可能会奏效,但如果您突然收到价值20000美元的物品,也可能会出错,我怀疑您的范围太多,无法手动定义它们。(请随意拔出这里的叉子和手电筒)

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

[x] 500-750 (11)
[x] 750-1000 (8)
[x] 1000-1500 (n)
[x] 1500-2000 (n)
[x] 2000$+ (n)
$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+或类似的值


干杯。

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

<?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();
?>

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

如果这是我问题的一个很好的解释,请发表一些评论,比如指出我的错误

这是输出

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;
}
private函数createRange($array){
排序($数组);
//设置范围限制。
//检查数组是否有5位数字。
$countDigitedNumbers=preg_grep('/\d{5}/',$array);
如果(计数($countDigitedNumber)>3){
$rangeLimits=阵列(010002500500010000150020000250000);
}否则{
$rangeLimits=数组(0,50250001000150020002500);
}
$ranges=array();
对于($i=0;$i=$lowLimit&$perPrice<$highLimit){
$ranges[$i]['values'][]=$perPrice;
}
}
}
返回$ranges;
}
$minprice=500;
对于($i=150;$i>0;$i--){
如果($minprice>150){
如果($minprice%150==0){
$roundminprice=$minprice;
}
}否则{
$roundminprice=0;
}
$minprice--;
}
$maxprice=1460;
对于($i=0;$i300){
如果($maxprice%150==0){
$roundmaxprice=$maxprice;
}
}否则{
$roundmaxprice=300;
}
$maxprice++;
}
echo“
最低价格=”.$roundminprice; echo“
最大Pice=”.$roundmaxprice;
到目前为止,您的努力是什么?为了实现这一点。。。从何处获得阵列?这是我的最新功能,但工作不正常。很多困惑。数组来自所选类别产品的mysql表。编辑:链接更新“…不知道pow或PHP中类似范围的函数的用法”。。。你是什么意思,比如
range()
:?我的意思是将这个条件与range的用法结合起来。我不能把我的逻辑放进去。您可以通过更改$maxPRoductInRange来选择每个范围的产品数量。您可能还想先对$prices数组进行排序。在我的案子里已经分类了。