массивы — алгоритм объединения диапазонов дат в переполнении стека

У меня есть массив с начальной и конечной датой в ключе / значении.
например.

/* formate 'mm/dd/yyyy'=>  'mm/dd/yyyy'*/

$arr = array(
'01/01/2016'=>'01/01/2016',
'01/02/2016'=>'01/02/2016',
'01/03/2016'=>'01/03/2016','04/10/2016'=>'04/10/2016',
'04/11/2016'=>'04/11/2016',
'04/12/2016'=>'04/12/2016','04/25/2016'=>'04/25/2016',

'04/30/2016'=>'04/30/2016',
'05/01/2016'=>'05/01/2016',
'05/02/2016'=>'05/02/2016' }

)

Здесь вы можете увидеть, что некоторые элементы постоянно имеют даты.
например. первые три элемента имеют даты с 04/01 по 04/03. Я хочу это в одном элементе. так что новый массив должен быть таким>

$arr = array(
'01/01/2016'=>'01/03/2016',

'04/10/2016'=>'04/12/2016',

'04/25/2016'=>'04/25/2016',

'04/30/2016'=>'05/02/2016'
})

Как это можно сделать?

Спасибо

1

Решение

Я знаю, что уже есть ответ, но вот моя версия — потратил немного времени на это, поэтому хотел поделиться!

Как и в вашем примере, я предполагаю, что ваш исходный массив находится в порядке дат, а ключи и значения всегда одинаковы.

Вы можете использовать функцию для перебора исходного набора данных и возврата массива сгруппированных дат следующим образом …

function group_dates($dates_array) {

// prepare results array
$result = array();

// take the first date from the submitted array
$group_start = array_shift($dates_array);
$timestamp_previous_iteration = strtotime($group_start);

// iterate over remaining values
foreach ($dates_array as $date) {
// calculate current iteration's timestamp
$timestamp_current = strtotime($date);

// calculate timestamp for 1 day before the current value
$timestamp_yesterday = strtotime('-1 day', $timestamp_current);

if ($timestamp_previous_iteration != $timestamp_yesterday) {
// create group...
$result[$group_start] = date('m/d/Y', $timestamp_previous_iteration);
// ...and store the next group's start date
$group_start = $date;
}

// log timestamp for next iteration
$timestamp_previous_iteration = $timestamp_current;
}

// add final group
$result[$group_start] = date('m/d/Y', $timestamp_previous_iteration);

return $result;
}

Затем вы можете использовать функцию следующим образом:

$result_array = group_dates($arr);

Подача функции массив в вашем примере приведет к массиву, как вы просили.

Как ваши даты отформатированы MM/DD/YYYY строка будет правильно преобразована в метку времени Unix strtotime(), Если вы использовали другие форматы даты, вы захотите взглянуть на объект PHP DateTime.

Ссылка
http://php.net/manual/en/function.strtotime.php
http://php.net/manual/en/book.datetime.php

3

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

Проверьте код ниже

<?php

$arr = array(
'01/01/2016'=>'01/01/2016',
'01/02/2016'=>'01/02/2016',
'01/03/2016'=>'01/03/2016',
'04/10/2016'=>'04/10/2016',
'04/11/2016'=>'04/11/2016',
'04/12/2016'=>'04/12/2016',
'04/25/2016'=>'04/25/2016',
'04/30/2016'=>'04/30/2016',
'05/01/2016'=>'05/01/2016',
'05/02/2016'=>'05/02/2016'
);

$lastDate = null;
$ranges = array();
$currentRange = array();

foreach ($arr as $date => $value ) {
$temp = $value;
$value = date_create(date('m/d/Y', strtotime($value)));

if (null === $lastDate) {
$currentRange[] = $temp;
} else {
// get the Date object
$interval = date_diff($value, $lastDate);

if ($interval->days === 1) {
// add this date to the current range
$currentRange[] = $temp;
} else {
// store the old range and start a new
$ranges[] = $currentRange;
$currentRange = array($temp);
}
}
$lastDate = $value;
}

$ranges[] = $currentRange;

$datemerge = array();
foreach ($ranges as $key) {
$count = count($key);
$datemerge[$key[0]] = $key[$count-1];
}

print_r($datemerge);

?>

Выход:

Array
(
[01/01/2016] => 01/03/2016
[04/10/2016] => 04/12/2016
[04/25/2016] => 04/25/2016
[04/30/2016] => 05/02/2016
)
1

По вопросам рекламы [email protected]