[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Удаление будущих дат из массива
Фарес
Всем доброго времени суток. У меня проблема ,уже час ломаю голову.Есть массив с датами,даты в нем как прошлого времени так и будущего.вот так выглядит каждый элемент массива 2001.05.02 18:28:17 ,понятное дело что даты каждого элемента массива разные. Так вот собственно вопрос как из массива удалить все даты которые больше теперешней.и отсортировать массив по убыванию



Спустя 15 минут, 18 секунд (18.02.2011 - 19:43) Dron19 написал(а):
Вариант без сортировки

$arr = array('2001.05.02 18:28:17','2010.07.28 18:15:05','2010.06.28 18:15:05','2012.06.28 18:15:05','2012.06.28 18:15:04');
$now_date = date('YmdHis');
$size = sizeof($arr);
for($i = 0; $i < $size; $i++) {
$new_format = preg_replace('#([0-9]+?)\.([0-9]+?)\.([0-9]+?)\s([0-9]+?):([0-9]+?):([0-9]+?)#i',
'$1$2$3$4$5$6',$arr[$i]);
if($new_format >= $now_date) $array[] = $arr[$i];
}

Спустя 1 час, 7 минут, 5 секунд (18.02.2011 - 20:50) Dron19 написал(а):
Ну в общем написал я функцию за тебя, по сколько писал сразу, не обдумывая как ее реализовать, получилась сложная в применении функция. Короче, что бы она сработала правильно, нужно сначала создать переменную с вызовом этой функции, в качестве параметра ей передать массив который хочешь отсортировать, затем вызвать вторую функцию и поместить результат ее работы в туже переменную, в которой был результат первой функции, в общем без второй функции произойдет сортировка только один раз каждого элемента...
В общем смотри на пример, главное посмотри как я вызываю эти функции и все...
Кстати, похоже я создал свой велосипед...

function del_and_sort($arr) {
if(is_array($arr)) {
$now_date = date('YmdHis');
$size = sizeof($arr);
for($i = 0; $i < $size; $i++) {
$new_format = preg_replace('#([0-9]+?)\.([0-9]+?)\.([0-9]+?)\s([0-9]+?):([0-9]+?):([0-9]+?)#i',
'$1$2$3$4$5$6',$arr[$i]);if($new_format >= $now_date) $array[] = $arr[$i];}
$new_format = preg_replace('#([0-9]+?)\.([0-9]+?)\.([0-9]+?)\s([0-9]+?):([0-9]+?):([0-9]+?)#i',
'$1$2$3$4$5$6',$array);
$size = sizeof($new_format);
for($i = 0; $i < $size; $i++) {
if(($i + 1) == $size) continue;
if($new_format[$i] > $new_format[$i+1]) {
$one_prev_val = $array[$i];
$one_next_val = $array[$i+1];
$array[$i] = $one_next_val;
$array[$i+1] = $one_prev_val;}
}
return $array;}else {return false;}}function end_step($arrx) {
$s = sizeof($arrx);
for($i = 0; $i < $s; $i++) {
$arrx = del_and_sort($arrx);
}return $arrx;}



$arr = array('2011.08.12 15:18:06','2001.05.12 15:18:07','2021.05.12 15:18:07',
'2012.05.12 15:18:07','2012.05.12 15:18:06','2012.05.12 15:18:04','2012.05.12 15:18:05');

$arrx = del_and_sort($arr);
$arrx = end_step($arrx);

echo print_r($arrx) . "<br>";

Этот пример выведет
Array ( [0] => 2011.08.12 15:18:06 [1] => 2012.05.12 15:18:04
[2] => 2012.05.12 15:18:05 [3] => 2012.05.12 15:18:06 [4] => 2012.05.12 15:18:07 [5] => 2021.05.12 15:18:07 ) 1

Как тебе и надо было, отсортированный вид массива. Главное запомни как пользоваться

Спустя 4 минуты, 57 секунд (18.02.2011 - 20:55) inpost написал(а):
$now = date("Y.m.d H:i:s");
foreach($array as $k => $v)
if($v > $now)
unset($array[$k]);
А теперь любая сортировка нужная: sort, asort и т.д. =)

Спустя 2 минуты, 5 секунд (18.02.2011 - 20:58) Dron19 написал(а):
не получится так
у тебя элементы будут уползать
вот ты удалишь к примеру 1 и 2 элемент
и у тебя будет массив начинаться с 3го элемента

Спустя 1 минута, 16 секунд (18.02.2011 - 20:59) Dron19 написал(а):
и вообще как у тебя не получится, у тебя сравнение по годам идет

Спустя 2 минуты, 33 секунды (18.02.2011 - 21:01) Dron19 написал(а):
у тебя не правильно сортирует
$now = date("Y.m.d H:i:s");
$array2 = array('2011.08.12 15:18:06','2001.05.12 15:18:07','2021.05.12 15:18:07','2012.05.12 15:18:07','2012.05.12 15:18:06','2012.05.12 15:18:04','2012.05.12 15:18:05');
foreach($array2 as $k => $v)
if($v > $now)
unset($array2[$k]);
sort($array2);
reset($array2);
echo print_r($array2) . "<br><br>";

выводит только одно значение

Спустя 1 минута, 8 секунд (18.02.2011 - 21:02) Dron19 написал(а):
он у тебя удаляет все, кроме 2001.05.12 15:18:07, как раз того, чего тут и не должно было быть

Спустя 19 минут, 4 секунды (18.02.2011 - 21:22) inpost написал(а):
Dron19
Внимательно условие читай. Ответ на него я дал уже.

Спустя 17 секунд (18.02.2011 - 21:22) YVSIK написал(а):
хоть это и ве-ло-си пед
эту функцию я собственн давно давно намечал написать
и она мне ну очень пригодиться
вот так что ваш труд не зря; не зря
спа-си-бо ! wink.gif wink.gif
кода дойду до этого тогда и буду разбирать !
щас пока не время !

Спустя 19 секунд (18.02.2011 - 21:22) Dron19 написал(а):
Во блин, я не правильно понял вопроса, и сделал все наоборот biggrin.gif biggrin.gif biggrin.gif biggrin.gif biggrin.gif biggrin.gif biggrin.gif biggrin.gif biggrin.gif biggrin.gif. Из массива удаляются все даты, которые уже мы прожили и оставшиеся сортируются biggrin.gif biggrin.gif biggrin.gif biggrin.gif

Спустя 24 минуты, 5 секунд (18.02.2011 - 21:46) inpost написал(а):
Dron19
Если надо наоборот (как ты думаешь), то достаточно поменять знак < на > в условии: if($v > $now)

Спустя 4 минуты, 4 секунды (18.02.2011 - 21:50) Dron19 написал(а):
inpost, это в твоем скрипте, а я то уже настрочил biggrin.gif biggrin.gif biggrin.gif

Спустя 3 минуты, 30 секунд (18.02.2011 - 21:54) Dron19 написал(а):
Цитата (YVSIK @ 18.02.2011 - 18:22)
хоть это и ве-ло-си пед
эту функцию я собственн давно давно намечал написать
и она мне ну очень пригодиться
вот так что ваш труд не зря; не зря
спа-си-бо  ! wink.gif  wink.gif
кода дойду до этого тогда и буду разбирать !
щас пока не время !

лучше свой уже напиши, потому что у меня вообще фуфло получилось, много лишних действий, хоть и работает

Спустя 1 час, 34 минуты, 13 секунд (18.02.2011 - 23:28) Snus написал(а):
inpost все правильно написал. Только я бы дополнил.

$now = time();
foreach($array as $k => $v){
if(strtotime($v) > $now) unset($array[$k]);
}
rsort($array);
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.