2014-12-05 5 views
1

Im пытается выяснить, как отсортировать массив ниже так, чтобы объекты массива отправляются в конец массива, оставаясь в start_date по убыванию.Сортировка массива, зависящего от значений

Редактировать. Id, вероятно, включает элемент значения ключа массива времени во всех массивах для сортировки по start_date.

[216] => Array (
    [title] => Production 1 
    [start_date] => 20th Feb 
    [end_date] => 23rd Feb 2015 
    [ticket_link] => http://www.google.co.uk 
    [writer] => Sarah Ruhl 
    [thumb_image] => /files/3514/1762/4350/Biz-Bio-Pic.jpg 
    [past] => 1 
) 

[218] => Array(
    [title] => Production 3 
    [start_date] => 27th Feb 
    [end_date] => 2nd Mar 2015 
    [ticket_link] => www.google.co.uk 
    [writer] => Sarah Ruhl 
    [thumb_image] => /files/9414/1762/4351/Dan-Bio-Pic.jpg 
    [past] => 1 
) 

[219] => Array (
    [title] => Production 4 
    [start_date] => 3rd Mar 
    [end_date] => 5th Mar 2015 
    [ticket_link] => www.google.co.uk 
    [writer] => Sarah Ruhl 
    [thumb_image] => /files/4314/1762/4351/Kate-Bio-Pic.jpg 
    [past] => 0 
) 
+2

это спрашивают много, ответ 'usort'. –

+1

[usort()] (http://www.php.net/manual/en/function.usort.php) - это функция, которую вы хотите. Вам нужно сравнить по датам (timestamp или DateTime objects), а не по строкам даты, поэтому вам потребуется преобразование в вашем обратном вызове; и как вы знаете, к чему относится год 'start_date'? –

+0

@MarkBaker Я сразу заметил это, когда разместил так отредактированный мой пост. Я использую отметку времени для 'start_date'. Я отформатировал текущее значение 'start_date', поэтому получение года не является проблемой. Как я могу убедиться, что элементы 'прошлых' тоже находятся в конце массива? –

ответ

2

Попробуйте это -

function checkdate($a, $b) 
{ 
    $a = strtotime($a['start_date']); 
    $b = strtotime($b['start_date']); 

    if ($a == $b) { 
     return 0; 
    } 

    return ($a > $b) ? -1 : 1; 
} 

function checkpast($a, $b) 
{ 
    $a_start = strtotime($a['start_date']); 
    $b_start = strtotime($b['start_date']); 

    if ($a_start == b_start) { 
     return ($a['past'] > $b['past']) ? -1 : 1; 
    } 

} 

$array = //your array 

usort($array, "checkdate"); 
usort($array, "checkpast"); 
+0

Прежде чем я отсортировал массив по дате, как бы упорядочить предыдущие элементы так, чтобы они находились в конце массива? –

+0

Как вы определяете «прошлые» предметы? –

+0

Его логическое значение 1 минус 0 является текущим –

Смежные вопросы