Сортировка массива дат с использованием asort()

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

У меня есть ряд дат, например:

"0"=>"09.10.2012"
"1"=>"02.10.12"
"2"=>"27.09.15"
"2.0"=>"28.09.2012"
"2.1"=>"29.9.2012"
"2.2"=>"29.09.2012"
"3"=>"9.10.2012"
"3.1"=>"23.4.10"
"4"=>"28.09.2012"
"5"=>"26.10.2012"
"6"=>"12.09.98"
"6.0"=>"05.03.2013"
"6.1"=>"23.4.2013"

(ключи являются строками по какой-либо причине)

Теперь я знаю, что они будут в том же формате - дни, месяц, годы. Но цифры цифр могут меняться, как вы можете видеть в данном массиве.

Я в основном разбирал их в день-месяц-год (европейский формат, который strtotime() распознал в соответствии с документацией), а затем изменил их на asort() времени Unix, я сортирую массив с помощью asort() и я получил плохие результаты:

[6]->[] -- 12.09.98
[1]->[1034380800] -- 02.10.12
[2.0]->[1348790400] -- 28.09.2012
[4]->[1348790400] -- 28.09.2012
[2.2]->[1348876800] -- 29.09.2012
[2.1]->[1348876800] -- 29.9.2012
[3]->[1349740800] -- 9.10.2012
[0]->[1349740800] -- 09.10.2012
[5]->[1351209600] -- 26.10.2012
[6.0]->[1362441600] -- 05.03.2013
[6.1]->[1366675200] -- 23.4.2013
[3.1]->[1681084800] -- 23.4.10
[2]->[1820966400] -- 27.09.15

Как вы можете видеть, [6](unixtime) содержит False, а strtotime() выполняет преобразование дат.

вот мой код:

function sortArrays_ByDate($target){

 foreach($target as $key_s => $val_s) { $date_exp = preg_replace('#(\.|_)#','-',$val_s); $target[(string)$key_s] = $date_exp; }

 foreach($target as $key_s => $val_s) { $date_exp = strtotime($val_s); $target[(string)$key_s] = $date_exp; }

 asort($target);
 return $target;

}

Может кто-нибудь объяснить мне, что не так...

благодаря

1 ответ

По какой-то причине европеец - не работал на 98, поэтому я рекомендую изменить год на 4-значный цифровой формат:

function sortArrays_ByDate($target){

 foreach($target as $key_s => $val_s) {
 $day = substr($val_s, 0, strpos($val_s, '.'));
 $month = substr($val_s, strpos($val_s, '.')+1, strrpos($val_s, '.')-strpos($val_s, '.')-1);
 $year = substr($val_s, strrpos($val_s, '.')+1);

 if($year > 79 && $year <= 99)
 $year = "19" . $year;
 elseif($year >=00 && $year <= 79)
 $year = "20" . $year;

 $target[(string)$key_s] = strtotime($day .'.'. $month .'.'. $year);
 }

 asort($target);

 /*foreach($target as $value)
 echo date("d.m.Y", $value) . '';
 changed for edit time to d.m.Y ->
 */

 foreach($target as $key_s => $val_s)
 $target[(string)$key_s] = date("d.m.Y", $target[(string)$key_s]);

 return $target;
}

Затем это сработало для меня, и массив отсортирован правильно.

Редактировать//

результат:

Array
(
 [0] => 09.10.2012
 [1] => 02.10.12
 [2] => 27.09.15
 [2.0] => 28.09.2012
 [2.1] => 29.9.2012
 [2.2] => 29.09.2012
 [3] => 9.10.2012
 [3.1] => 23.4.10
 [4] => 28.09.2012
 [5] => 26.10.2012
 [6] => 12.09.98
 [6.0] => 05.03.2013
 [6.1] => 23.4.2013
)
Array
(
 [6] => 12.09.1998
 [3.1] => 23.04.2010
 [4] => 28.09.2012
 [2.0] => 28.09.2012
 [2.1] => 29.09.2012
 [2.2] => 29.09.2012
 [1] => 02.10.2012
 [3] => 09.10.2012
 [0] => 09.10.2012
 [5] => 26.10.2012
 [6.0] => 05.03.2013
 [6.1] => 23.04.2013
 [2] => 27.09.2015
)

licensed under cc by-sa 3.0 with attribution.