2013-12-12 4 views
1

У меня есть база данных с полями днем ​​и ценами (изображение ниже)массив данных Диапазона по полю

enter image description here

Я хочу сделать что-то вроде результата:

дня | цена

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 
     ) 

) 

Сейчас я думаю о петлевой массив, но не имею представления о том, как решить эту проблему

+0

Viktors, какой двигатель базы данных вы используете? Это может быть не очень медленный запрос, чтобы вытащить данные в этом формате. – OGHaza

ответ

2

Вашего вопрос может быть решен с одним витком:

$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 
     ) 

) 
+0

Downvoter, прокомментируйте? // _Or просто отправить ответ на конец очереди? _ –

+0

спасибо за код, я попытался скопировать его в тестовый файл (test), чтобы проверить, и он получает ошибки, потому что [] .... после того, как я изменил его не работает с $ price = current ($ array ['price']); $ min = current ($ array ['day']); – Viktors

+0

Предупреждение: current() ожидает, что параметр 1 будет массивом, значение null. Вы протестировали свой код в php-файле? – Viktors

Смежные вопросы