2016-05-09 8 views
-1

Ich habe Array wie folgt:PHP - Gruppe das Array basierend auf Datum

$events = [ 

[ 
    'title' => 'Event 1', 
    'description' => 'Some Text', 
    'date_added' => 2016-05-06 14:57:39 
], 

[ 
    'title' => 'Event 2', 
    'description' => 'Some Text', 
    'date_added' => 2016-05-08 14:57:39 
], 
[ 
    'title' => 'Event 3', 
    'description' => 'Some Text', 
    'date_added' => 2016-05-09 14:57:39 
], 
[ 
    'title' => 'Event 4', 
    'description' => 'Some Text', 
    'date_added' => 2016-05-09 15:57:39 
] 

]; 

Ich brauche Daten wie diese zeigen:

**Today events:** 
Event 4, 
Event 3 

**Yesterday events** 
Event 2 

**May 6th events** 
Event 1 

Wie kann ich das tun? Ist es möglich?

+2

Schleife durch das Array und verwenden das Datum als Schlüssel und die Werte als Array auf den Schlüssel – Rizier123

+0

hinzufügen Haben Sie etwas versucht? Zeig uns bitte einen Code. – olibiaz

+0

Diese Frage ist ziemlich breit. Ist das Problem das Sortieren? Die Gruppierung? oder die Umwandlung von Daten in "heute" und "gestern". – apokryfos

Antwort

1

Dies funktioniert genau so, wie Sie möchten. Versuchen Sie Folgendes:

Zuerst müssen wir die Datensätze Datum weise sortieren. Wir können usort() Funktion dafür verwenden.

function compare_date($a, $b) { 

    if ($a['date_added'] === $b['date_added']){ 
     return 0; 
    } 

    return ($a['date_added'] > $b['date_added']) ? -1 : 1; 
} 

usort($events, "compare_date"); 

Als nächstes erstellen wir ein benutzerdefiniertes Array, das Titel Datum hält.

foreach($events as $event) { 

    $today_date = strtotime(date("Y-m-d H:i:s")); 
    $event_date = strtotime($event['date_added']); 
    $diff  = floor(($today_date - $event_date)/(60*60*24)); 

    switch($diff) { 
     case 0: 
      $title    = "Today events:<br/>"; 
      $result[$title][] = $event['title']; 
      break; 
     case 1: 
      $title    = "Yesterday events:<br/>"; 
      $result[$title][] = $event['title']; 
      break; 
     default: 
      $title    = date("M jS", $event_date)." Events:<br/>"; 
      $result[$title][] = $event['title']; 
    } 
} 

Schließlich durchlaufen wir dieses $ Ergebnis und zeigen die gewünschte Ausgabe an.

foreach($result as $k => $rslt) { 

    echo $k; 
    echo implode("<br>", $rslt); 
    echo "<br/>"; 
} 
0

Sie können dies tun usort mit():

function date_compare($a, $b) { 
    $t1 = strtotime($a['date_added']); 
    $t2 = strtotime($b['date_added']); 
    return $t1 - $t2; 
}  
usort($events, 'date_compare'); 

sie anzuzeigen, können Sie die folgende Anweisung foreach verwenden:

foreach ($events as $key) { 
    $dt = new DateTime($key['date_added']); 
    $date = $dt->format('F j'); 
    if($current != $date) { 
     $current = $date; 
     echo "<br>**".$date." events:**<br>"; 
    } 
    echo $key["title"]."<br>"; 
} 

Der Ausgang:

**May 1 events:** 
Event 3 

**May 3 events:** 
Event 1 

**May 8 events:** 
Event 2 

**May 9 events:** 
Event 4 

Hoffnung Diese Lösung funktioniert. Wünsche Ihnen das Beste.

0

Sie können auch versuchen, diese:

// method to compare two values 
function compare_date($a, $b) { 

    if ($a['date_added'] === $b['date_added']){ 
     return 0; 
    } 

    return ($a['date_added'] > $b['date_added']) ? -1 : 1; 
} 

// callback function 
usort($events, "compare_date"); 

$today = date("Y-m-d"); 
$yesterday = date('Y-m-d', strtotime("yesterday")); 

$myEvents = array(); 

foreach ($events as $key => $val) : 
    $datetime = new DateTime($val['date_added']); 
    $record_date = $datetime->format('Y-m-d'); 

    if ($today == $record_date): 
     $myEvents['today'][] = $events[$key]; 
    elseif ($yesterday == $record_date): 
     $myEvents['yesterday'][] = $events[$key]; 
    else : 
     $myEvents[$record_date][] = $events[$key]; 
    endif; 
endforeach; 

// display event 
foreach($myEvents as $i => $v): 
    if ($i!="today" && $i!="yesterday"): 
     echo date('M d', strtotime($i)) . "<br>";  
    else : 
     echo $i . "<br>"; 
    endif; 

    foreach ($v as $e): 
     echo $e['title'] . "<br>"; 
    endforeach; 
    echo "<br>"; 
endforeach; 

Von oben Code zu setzen ist:

heute

Ereignis 4

Ereignis 3

gestern

Ereignis 2

6. Mai

Ereignis 1

Verwandte Themen