Php 按字段排列的阵列数据范围
我有一个包含字段日期和价格的数据库(下图) 我想得出如下结果: 日价格 1-3 | 5 4 | 6 7-8 | 10 13+| 20 我认为(将这些工作交给sql)对数据库来说很难(我说的是速度) 数据库结果:Php 按字段排列的阵列数据范围,php,sql,arrays,sorting,date-sorting,Php,Sql,Arrays,Sorting,Date Sorting,我有一个包含字段日期和价格的数据库(下图) 我想得出如下结果: 日价格 1-3 | 5 4 | 6 7-8 | 10 13+| 20 我认为(将这些工作交给sql)对数据库来说很难(我说的是速度) 数据库结果: Array ( [0] => Array ( [id] => 1 [day] => 1 [price] => 5 ) [1] => A
Array
(
[0] => Array
(
[id] => 1
[day] => 1
[price] => 5
)
[1] => Array
(
[id] => 2
[day] => 2
[price] => 5
)
[2] => Array
(
[id] => 3
[day] => 3
[price] => 5
)
[3] => Array
(
[id] => 4
[day] => 4
[price] => 6
)
[4] => Array
(
[id] => 7
[day] => 7
[price] => 10
)
[5] => Array
(
[id] => 8
[day] => 8
[price] => 10
)
[6] => Array
(
[id] => 9
[day] => 13
[price] => 20
)
)
现在我正在考虑循环阵列,但不知道如何解决这些问题您的问题可以通过单循环解决:
$array = [
['id'=>2, 'day'=>2, 'price'=>5],
['id'=>5, 'day'=>3, 'price'=>7],
['id'=>7, 'day'=>8, 'price'=>8],
['id'=>6, 'day'=>4, 'price'=>5],
['id'=>1, 'day'=>1, 'price'=>5],
['id'=>9, 'day'=>9, 'price'=>8],
['id'=>11, 'day'=>13, 'price'=>10],
['id'=>15, 'day'=>12, 'price'=>10]
];
//sort by day. You can skip this if perform ORDER BY `day` in DBMS
usort($array, function($x, $y)
{
return $x['day']-$y['day'];
});
$price = current($array)['price'];
$min = current($array)['day'];
$max = $min;
$result = [];
foreach($array as $i=>$item)
{
if($price!=$item['price'])
{
$result[] = ['day' => $min==$max?$min:$min.'-'.$max, 'price'=>$price];
$min = $item['day'];
$max = $min;
}
else
{
$max = $item['day'];
}
$price = $item['price'];
}
$result[] = ['day' => $min.'+', 'price'=> $price];
最终结果如下所示:
Array
(
[0] => Array
(
[day] => 1-2
[price] => 5
)
[1] => Array
(
[day] => 3
[price] => 7
)
[2] => Array
(
[day] => 4
[price] => 5
)
[3] => Array
(
[day] => 8-9
[price] => 8
)
[4] => Array
(
[day] => 12+
[price] => 10
)
)
唐纳德,有什么评论吗?//或者只是将答案发送到队列的末尾?感谢您提供的代码,我试图将其复制到样本(测试)文件中进行测试,但它出现了错误,因为[…]。。。。当我更改后,它不能与$price=current($array['price'])一起工作$最小值=当前($array['day']);警告:current()要求参数1为数组,给定null。您是否在php文件中测试了代码?这是关于php版本的。您应该使用
array()
而不是5.3及更早版本中的[]
。另外,在5.4版本之前,无法通过()
取消引用,因此请使用$pointer=current($array)$价格=$pointer['price']$最小值=$pointer['day']代码>+1。此外,您还应该检查一天的变化是否超过一天(即两天不是连续的,但价格相同)。Viktors,您使用的是什么数据库引擎?以这种格式提取数据可能不是一个特别慢的查询。