【问题标题】:Range array data by field按字段排列的范围数组数据
【发布时间】:2013-12-30 21:00:47
【问题描述】:

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

我想做一个类似的结果:

天 |价格

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
        )

)

现在我正在考虑循环一个数组,但不知道如何解决这些问题

【问题讨论】:

  • Viktors,你用的是什么数据库引擎?以这种格式提取数据可能不是特别慢的查询。

标签: php sql arrays sorting date-sorting


【解决方案1】:

您的问题可以通过单循环解决:

$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 = 当前($array['price']); $min = current($array['day']);
  • 警告:current() 期望参数 1 是数组,给定 null。你在 php 文件中测试过你的代码吗?
  • 那是关于 PHP 版本的。在 5.3 和更早版本中,您应该使用 array() 而不是 []。在 5.4 之前也无法通过 () 取消引用,因此请使用 $pointer = current($array); $price=$pointer['price']; $min = $pointer['day'];
  • +1。此外,您应该检查一天的变化是否超过一天(即两天不连续但价格相同)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-08-26
  • 1970-01-01
  • 2013-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-30
相关资源
最近更新 更多