【问题标题】:How to create Price Range dynamically with PHP如何使用 PHP 动态创建价格范围
【发布时间】:2014-02-25 11:07:19
【问题描述】:

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

  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 中 pow 或 range 之类的函数的用法。希望你能帮忙:/

【问题讨论】:

  • 到目前为止你的努力是什么?实现这一目标......你从哪里得到数组?
  • laravel.io/bin/RkQ7 这是我的最新功能,但无法正常工作。很多困惑。数组来自属于所选类别的产品的 mysql 表。编辑:链接更新
  • "...不知道 PHP 中类似 pow 或 range 的函数的用法" ...您的意思是 range() : uk3.php.net/range ?
  • 我的意思是将这些条件与范围的使用结合起来。我不能把我的逻辑放进去。

标签: php range


【解决方案1】:

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

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

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;
}

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 您可以通过更改 $maxPRoductInRange 来选择每个范围的产品数量。您可能还想先对 $prices 数组进行排序。在我的情况下它已经排序了。
    【解决方案3】:

    就个人而言,我会去定义一个具有所需范围的数组(在配置中或直接),因为您可能正在销售价值 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+ 或类似的东西。

    干杯。

    【讨论】:

      【解决方案4】:
      $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;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-12-16
        • 1970-01-01
        • 2022-08-14
        • 2011-11-07
        • 1970-01-01
        • 1970-01-01
        • 2019-11-21
        相关资源
        最近更新 更多