Диапазон данных массива по полю
У меня есть база данных с полями день и цены (изображение ниже)
Я хочу сделать результат что-то вроде:
день | цена
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
)
)
Сейчас я думаю о цикле массива, но не знаю, как решить эту проблему
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
)
)