如何从价格数组创建价格范围?假设我有这个持有价格的数组:
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中的功能。希望你能提供帮助:/
答案 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;