Mit Versionen gefülltest Array sortieren

Auch eine gute Idee! Ich würde aber gerne von euch / anderen / mehreren eine Meinung hören wie es besser / warum umgesetzt wird/werden sollte...

Ich habe jetzt mal mit PHP weiter gemacht und folgendes Skript, welches mir sortiert die relevanten Ergebnisse korrekt auswirft (noch nicht auf Herz und Nieren getestet):

PHP:
$v1 = isset($_POST['v1']) ? $_POST['v1'] : "";
$v2 = isset($_POST['v2']) ? $_POST['v2'] : "";
$v1exp = explode(".", $v1);
$v2exp = explode(".", $v2);
if($v1exp[3] > $v2exp[3]) {
	$v1 = implode(".", $v2exp);
	$v2 = implode(".", $v1exp);
}
$base = $v1exp[0].".".$v1exp[1].".".$v1exp[2].".";

$qry = mysql_query("SELECT `ID`, `version` FROM `releases` WHERE `version` LIKE '" . $base . "%'");
while($row = mysql_fetch_assoc($qry)) {
	$ver = $row['version'];
	if(preg_match("/[0-9]{1,}$/", $ver, $match) && $match[0] <= $v1exp[3] &&  $match[0] >= $v2exp[3]) {
		$allReleases[] = preg_replace("/\.([0-9]{1})$/", '.0$1', $ver);
		$allIDs[] = $row['ID'];
	}
}
sort($allReleases);
print_r($allReleases);
*edit
ich sehe gerade, dass es noch ein Problem gibt weil ich unten $v1exp benutze aber die variablen nicht getauscht habe, falls die versionen "falschrum" ausgewählt wurden.
Eigentlich müssen ja nur die Werte von $v1exp und $v2exp wie mit dem implode getauscht werden.
 
Zuletzt bearbeitet:
Keine Ahnung was die obige SQL-Anweisung bei dir für ein Ergebnis geliefert hat, der Test bei mir sah damit gut und richtig aus.

In diesem Fall verstehe jetzt nicht was du bei deinem Code für einen Vorteil hast!?
 
Weiss ich selbst nicht!

Ich bin kein so erfahrener / professioneller Coder.. deshalb frag ich ja nach einem Vergleich bzw. was es für Vor- / Nachteile bringt den einen oder anderen Weg zu gehen.

Aber: Ja, deine Abfrage funktioniert auch wunderbar.
 
Dann behaupte ich mal hat dein Code zumindest den Nachteil das er länger ist und sich Fehler viel einfacher einschleichen können.
 
Wird mit SQL ein gebastel. Mit array_multisort() in PHP ists kein Problem

PHP:
$versions = array('1.4.5.3', '1.4.5.22', '1.4.5.11');

foreach($versions as $version){
    $parts = explode('.', $version);
    $major[] = (int)$parts[0];      
    $minor[] = (int) $parts[1];  
    $srviceP[] = (int) $parts[2];
    $build[] = (int) $parts[3];
}

array_multisort($major, $minor, $srviceP, $build, $versions);
var_dump($versions);
 
Ok, dann erweitere es aber auch so das man nur die gewünschten Einträge aus der Liste/dem Array bekommt.

Im Moment ist es so zwar schön sortiert (Punkt für dich) aber es liefert immer alle und nicht nur einen Bereich von/bis.
 
Oh, hab ich gar nicht gesehen. Naja, die Erweiterung ist nicht weiter schwer. eine kleine Compare-Funtion einbauen und schon hat mans

PHP:
$versions = array('1.4.5.3', '1.4.5.22', '1.4.5.6', '1.4.5.55');

$von = '1.4.5';
$bis = '1.4.5.44';

$vonParts = explode('.', $von);
$bisParts = explode('.', $bis);
foreach($versions as $index => $version){
    $parts = explode('.', $version);
    if(versionValidation($parts)){
        $major[] = (int)$parts[0];      
        $minor[] = (int) $parts[1];  
        $srviceP[] = (int) $parts[2];
        $build[] = (int) $parts[3];
        $validVersions[$index] = $version;
    }
}

array_multisort($major, $minor, $srviceP, $build, $validVersions);
var_dump($validVersions);

function versionValidation($parts){
    foreach($parts as $pos => $part){
        //Prüfen ob der aktuelle Wert ausserhab der Grenzen liegt
        if($GLOBALS['vonParts'][$pos] > $part || $part > $GLOBALS['bisParts'][$pos]){
            return false;
        }
    }
    return true;
}
 
Und wie ist das hier:

SQL:
SELECT ID, version FROM releases WHERE SUBSTRING_INDEX(version, ".", 3) = "4.12.1" AND SUBSTRING_INDEX(version, ".", -1) BETWEEN 3 AND 7;

Also ich würde dann wohl auch eher tombes Lösung nehmen. Ist ein recht einfaches SQL Statement und schmeisst auch direkt die Versionen raus, die zwar die gleiche SrviceP-Nummer haben, aber eine zu kleine oder zu große Build-Nummer haben.

Evtl. kann man noch eine kleine Modifikation vor nehmen und das erste SUBSTRING_INDEX durch eine like abfrage ersetzen, da man dann evtl. mehr Performance durch einen SQL-INDEX hat. Außerdem kannst du auch schon in SQL sortieren, und braucht nachher in PHP gar nichts mehr machen!

SQL:
SELECT ID, version FROM releases WHERE version LIKE "4.12.1.%" AND SUBSTRING_INDEX(version, ".", -1) BETWEEN 3 AND 7 ORDER BY SUBSTRING_INDEX(version, ".", -1);

Ansonsten ist das wesentlich eleganter, als jegliches PHP. Finde ich.
 
Das Sortieren hatte ich bei meinem Test hier auch mit drin. Aber doof wie ich bin, habe ich an einen Vergleich mit LIKE im Moment gar nicht gedacht.

Gute Idee von dir!
 
Zurück