Сортируйте массив php и сохраняйте меньшие по времени дублированные элементы

У меня есть следующий массив данных в php.

   Array
(
[0] => Array
(
[time] => 2014-12-01T00:00:00
[value] => 0.0107
)

[1] => Array
(
[time] => 2014-12-01T00:05:35
[value] => 0.0321
)

[2] => Array
(
[time] => 2014-12-01T00:05:35
[value] => 0.0107
)

[3] => Array
(
[time] => 2014-12-01T00:06:41
[value] => 0.0535
)

[4] => Array
(
[time] => 2014-12-01T00:06:41
[value] => 0.0107
)

[5] => Array
(
[time] => 2014-12-01T00:13:04
[value] => 0.0321
)
)

Я сортирую данные массива, собирая их по дате, используя следующий код:

$sortedData = array();
foreach ($data as $element) {
$timestamp = strtotime($element['time']);
$date = date("d.m.Y", $timestamp);
if ( ! isSet($sortedData[$date]) ) {
$sortedData[$date] = array($element);
} else {
$sortedData[$date][] = $element;
}
}

Таким образом, результат имеет следующую структуру:

Array
(
[01.12.2014] => Array
(
[0] => Array
(
[time] => 2014-12-01T00:00:00
[value] => 0.0107
)

[1] => Array
(
[time] => 2014-12-01T00:05:35
[value] => 0.0321
)

[2] => Array
(
[time] => 2014-12-01T00:05:35
[value] => 0.0107
)

[3] => Array
(
[time] => 2014-12-01T00:06:41
[value] => 0.0535
)

[4] => Array
(
[time] => 2014-12-01T00:06:41
[value] => 0.0107
)
...
)

Проблема в том, что в массив входят элементы с одинаковым временем, но разным значением. Есть ли способ отфильтровать дубликаты (дублированные по времени элементы), чтобы сохранить только меньший (значение) элемент дубликатов?

Поэтому я хотел бы что-то вроде этого (индекс каждого элемента — это время, а значение меньше дублированных элементов предыдущего массива):

Array
(
[01.12.2014] => Array
(
[2014-12-01T00:00:00] => Array
(
[time] => 2014-12-01T00:00:00
[value] => 0.0107
)

[2014-12-01T00:05:35] => Array
(
[time] => 2014-12-01T00:05:35
[value] => 0.0107
)

[2014-12-01T00:06:41] => Array
(
[time] => 2014-12-01T00:06:41
[value] => 0.0107
)
...
)

Любая помощь, как это сделать? Большое спасибо!!

0

Решение

Это отлично работает приятель:

$sortedData = array();
foreach ($data as $element) {
$timestamp = strtotime($element['time']);
$date = date("d.m.Y", $timestamp);
if ( ! isset($sortedData[$date][$element['time']]) ) {
$sortedData[$date][$element['time']] = $element;
$sortedData[$date][$element['time']]['lowest_value'] = $element['value'];
}
if ($sortedData[$date][$element['time']]['lowest_value'] >  $element['value']) {
$sortedData[$date][$element['time']] = $element;
$sortedData[$date][$element['time']]['lowest_value'] =  $element['value'];
}
}

Вот если вы хотите проверить:
http://ideone.com/9W5lbZ

0

Другие решения

Попробуй это

$sortedDataHash = array();
foreach ($data as $element) {
$timestamp = strtotime($element['time']);
if (!isset($sortedDataHash[$timestamp])) {
$sortedDataHash[$timestamp] = $element;
} else {
$sortedDataHash[$timestamp] = $element['value'] < $sortedDataHash[$timestamp]['value']
? $element : $sortedDataHash[$timestamp];
}
}

$sortedData = array();
foreach ($sortedDataHash as $key => $val) {
$date = date("d.m.Y", $key);
if ( ! isSet($sortedData[$date]) ) {
$sortedData[$date] = array($val);
} else {
$sortedData[$date][] = $val;
}
}

Может быть, есть выход лучше метод ^ — ^!

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector