2016-05-17 4 views
2

Ich habe meinen fairen Anteil der Forschung getan, bevor Sie dies und ich brauche jetzt eine Hand in die richtige Richtung. Ich habe eine Liste von IP-Kamera-Dateinamen. Die Dateinamen sind die Zeitstempel selbst, die ich sortieren muss. Ich kann nicht herausfinden, wie man die Daten auf den String-Namen sortiert. Ich denke, ich muss die Zeichenfolge in ein lesbares Format für die Funktion strtotime() konvertieren? Oder gibt es einen Weg, ohne die Saite zu ändern? Ich habe keine Ahnung, wie ich dieses Problem richtig angehen kann.Benötigen Sie Hilfe Sorting Array mit Timestamp in PHP

Ich habe array_multisort($array, SORT_DESC, SORT_NUMERIC); ohne Glück versucht.

$array = Array ('SNAP_CH04_2016_05_15_18_11_05_62777.jpg', 'SNAP_CH01_2016_05_15_18_05_38_63588.jpg', 'SNAP_CH02_2016_05_15_18_05_13_38387.jpg', 'SNAP_CH04_2016_05_15_15_55_28_52502.jpg', 'SNAP_CH04_2016_05_15_14_52_46_26039.jpg', 'SNAP_CH03_2016_05_15_14_52_39_18421.jpg', 'SNAP_CH04_2016_05_15_14_51_34_19005.jpg', 'SNAP_CH02_2016_05_15_14_51_25_9874.jpg', 'SNAP_CH04_2016_05_15_06_12_49_23707.jpg', 'SNAP_CH04_2016_05_15_05_03_09_38176.jpg', 'SNAP_CH04_2016_05_15_03_33_27_29791.jpg', 'SNAP_CH03_2016_05_15_01_59_29_27941.jpg'); 

Jeder Rat wird geschätzt. Versuche zu lernen.

+0

Hat es durch den Dateinamen sortiert werden (einschließlich SNAP_CH04. ..) oder nur der Zeitstempel? Wenn Sie nur den Dateinamen verwenden, sollten Sie nur 'sort ($ array)' oder 'natsort ($ array)' –

+0

verwenden können. Es muss nach dem Zeitstempel sortiert werden. – NewbTechGuy

+0

Dann müssen Sie wahrscheinlich in ['usort()'] (https://secure.php.net/manual/en/function.usort.php) –

Antwort

2

können Sie verwenden, um die usort Funktion, die wir an, Sie definieren eine benutzerdefinierte Funktion die Saiten vergleichen . Hier ist, wie es funktionieren könnte:

<?php 

function timestamp_cmp($a, $b) { 
    $first = substr($a, 10); 
    $second = substr($b, 10); 
    return strnatcmp($first, $second); 
} 
$array = Array ( 
    'SNAP_CH04_2016_05_15_18_11_05_62777.jpg', 
    'SNAP_CH01_2016_05_15_18_05_38_63588.jpg', 
    'SNAP_CH02_2016_05_15_18_05_13_38387.jpg', 
    'SNAP_CH04_2016_05_15_15_55_28_52502.jpg', 
    'SNAP_CH04_2016_05_15_14_52_46_26039.jpg', 
    'SNAP_CH03_2016_05_15_14_52_39_18421.jpg', 
    'SNAP_CH04_2016_05_15_14_51_34_19005.jpg', 
    'SNAP_CH02_2016_05_15_14_51_25_9874.jpg', 
    'SNAP_CH04_2016_05_15_06_12_49_23707.jpg', 
    'SNAP_CH04_2016_05_15_05_03_09_38176.jpg', 
    'SNAP_CH04_2016_05_15_03_33_27_29791.jpg', 
    'SNAP_CH03_2016_05_15_01_59_29_27941.jpg' 
); 

usort($array,'timestamp_cmp'); 

Hinweis: Wenn Sie sind auf PHP 5.3+, können Sie dies tun:

usort($array,function($a, $b) { 
    $first = substr($a, 10); 
    $second = substr($b, 10); 
    return strnatcmp($first, $second); 
}); 
+0

Wie funktioniert Ihre Funktion? Es vergleicht das erste gespeicherte Element mit dem zweiten gespeicherten Element im Array, dann vergleicht strcmp() die Zeichenfolge? – NewbTechGuy

+0

@NewbTechGuy Die Funktion entfernt die ersten 10 Zeichen des ersten und zweiten Elements und ruft dann strcmp auf, um sie zu vergleichen. Diese Funktion wird jedes Mal aufgerufen, wenn zwei Elemente im Sortieralgorithmus sortiert werden müssen. –

+0

@NewbTechGuy Die benutzerdefinierte Funktion soll -1 zurückgeben, wenn das erste Element kleiner als das zweite ist, 0, wenn sie gleich sind, und 1, wenn das zweite Element größer als das erste ist. Da strcmp das bereits tut, muss ich diese Funktion nur aufrufen, nachdem ich die Zeichen entfernt habe, die wir nicht brauchen. –

1

Solange Sie den mitgelieferten "SNAP_CH_04" -Teil des Namens sortieren können, können Sie einfach sort() verwenden, um das Array ohne Konvertierung zu sortieren.

sort($array); 

Wenn Sie diesen Teil aus abzustreifen, dann können Sie substr verwenden dann sort(), wie folgt aus:

for ($a = 0; $a < count($array); $a++) 
{ 
    $array[$a] = substr($array,10); 
} 

sort($array); 
+0

1. Der Bereich, den Sie verwenden, ändert nicht das ursprüngliche Array, nur die '$ a'-Variable innerhalb der' foreach', 2. Dies sortiert das ursprüngliche Array und bietet keinen Verweis zurück auf die ursprünglichen Dateinamen . Das Ändern der Dateinamen ist für niemanden gut. –

+0

Du hast Recht, ich habe das gesehen, sobald ich die ursprüngliche Antwort gepostet habe. Ich änderte es, um das Array zu modifizieren und dann zu sortieren, aber ich denke, das ist wahrscheinlich auch nicht der beste Ansatz. 'usort()' ist wahrscheinlich der beste Weg, um hierher zu kommen. –

+0

Ja, das obige foreach zerstört das ursprüngliche Array, ohne es zu sortieren. :/ – NewbTechGuy