Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 按字段排列的阵列数据范围_Php_Sql_Arrays_Sorting_Date Sorting - Fatal编程技术网

Php 按字段排列的阵列数据范围

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

我有一个包含字段日期和价格的数据库(下图)

我想得出如下结果:

日价格

1-3 | 5

4 | 6

7-8 | 10

13+| 20

我认为(将这些工作交给sql)对数据库来说很难(我说的是速度)

数据库结果:

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,您使用的是什么数据库引擎?以这种格式提取数据可能不是一个特别慢的查询。