2017-06-28 5 views
0

Im Anschluss an meinem Code all aktuellen Termine von Terminen Array in einem Monat zu bringenPHP vorherige Werte vergleichen und speichern neuesten Wert in Array

$dates = Array 
(
"2017/03/05", 
"2017/03/06", 
"2017/04/01", 
"2017/04/16", 
"2017/06/16", 
"2017/06/19", 
"2017/07/07", 
"2017/08/19", 

); 
$curr_val = ''; 
$years = Array(); 
$months = Array(); 
foreach($dates as $d) { 
    list($y,$m) = explode("/",$d); 
    $years[$y][] = $d; 

if ($m != $curr_val){ 
     $months[$y."/".$m][] = $d; 
     $curr_val = $m ; 
    } 
} 
$years = array_values($years); 
$months = array_values($months); 

print_r($months); 

Above Code Werte von ersten Auftreten Datum in einem Monat zu drucken. Aber ich möchte das neueste Datum von Monat.

Above Code gibt Ausgang folgende

Array ([0] => Array ([0] => 2017/03/05) [1] => Array ([0] => 2017/04/01) [2] => Array ([0] => 2017/06/16) [3] => Array ([0] => 2017/07/07) [4] => Array ([0] => 2017/08/19)) 

Aber Code erwartet

ist
Array ([0] => Array ([0] => 2017/03/06) [1] => Array ([0] => 2017/04/16) [2] => Array ([0] => 2017/06/19) [3] => Array ([0] => 2017/07/07) [4] => Array ([0] => 2017/08/19)) 

Statt Druck ersten Datum in Monat, möchte ich letzte Tag des Monats gedruckt werden. wie kann ich das bekommen ??

Antwort

1

Ihr Code könnte stark reduziert werden. Hier ist, was ich tun konnte:

$dates = Array 
(
"2017/03/05", 
"2017/03/06", 
"2017/04/01", 
"2017/04/16", 
"2017/06/16", 
"2017/06/19", 
"2017/07/07", 
"2017/08/19", 

); 
$array = []; 
foreach($dates as $d) { 
    $date = \DateTime::createFromFormat('Y/m/d' , $d); 

    if (
     !isset($array[$date->format('Y')][$date->format('m')]) 
     || $array[$date->format('Y')][$date->format('m')] < $date 
    ) { 
     $array[$date->format('Y')][$date->format('m')] = $date; 
    }   
} 

print_r($array); 

Es ist eine einfache Logik, das überprüft, ob der Wert höher im gleichen Jahr/Monat ist und ersetzen, wenn es ist.

Ergebnis:

Array (
[2017] => Array 
    (
     [03] => DateTime Object 
      (
       [date] => 2017-03-06 22:18:42.000000 
       [timezone_type] => 3 
       [timezone] => Europe/Amsterdam 
      ) 

     [04] => DateTime Object 
      (
       [date] => 2017-04-16 22:18:42.000000 
       [timezone_type] => 3 
       [timezone] => Europe/Amsterdam 
      ) 

     [06] => DateTime Object 
      (
       [date] => 2017-06-19 22:18:42.000000 
       [timezone_type] => 3 
       [timezone] => Europe/Amsterdam 
      ) 

     [07] => DateTime Object 
      (
       [date] => 2017-07-07 22:18:42.000000 
       [timezone_type] => 3 
       [timezone] => Europe/Amsterdam 
      ) 

     [08] => DateTime Object 
      (
       [date] => 2017-08-19 22:18:42.000000 
       [timezone_type] => 3 
       [timezone] => Europe/Amsterdam 
      ) 

    ) 

) 
1

So:

foreach($dates as $d) { 
    list($y,$m) = explode("/",$d); 
    $years[$y][] = $d; 
    $months[$y."/".$m] = [$d]; 
} 

Sorgen Sie sich nicht den Überblick über den aktuellen Wert zu halten. Überschreiben Sie einfach $months[$y."/".$m], während Sie gehen, und Sie werden mit dem letzten Datum für jeden Monat enden.

Wenn Sie das neueste Datum aus jedem Monat und nicht nur das letzte im Eingabearray abrufen möchten, vergewissern Sie sich, dass $dates vor dem Start der Schleife sortiert ist. Da sie im Format Jahr/Monat/Tag sind, sollte ein einfacher sort($dates); funktionieren. (Im Fall von Ihrem Beispiel $dates bereits sortiert ist, so wird dies keinen Unterschied.)

0

Dies scheint einfachsten zu mir:

Code: (Demo)

$dates[ 
    "2017/03/05", 
    "2017/03/06", 
    "2017/04/01", 
    "2017/04/16", 
    "2017/06/16", 
    "2017/06/19", 
    "2017/07/07", 
    "2017/08/19" 
]; 
foreach($dates as $d){ 
    $result[substr($d,0,7)]=$d; // extract unique key from values 
} 
$result=array_values($result); // reindex array 
var_export($result); 

Ausgang:

array (
    0 => '2017/03/06', 
    1 => '2017/04/16', 
    2 => '2017/06/19', 
    3 => '2017/07/07', 
    4 => '2017/08/19', 
) 
Verwandte Themen