usort()

mayermart

Mitglied
Hallo zusammen,

ich versuche mich gerade an einem Serverviewer für einen Gameserver.
Dabei habe ich ein kleines Problem mit dem Sortieren der Spieler.

Ich hätte gerne eine Sortierung zuerst nach Teamzugehörigkeit mit anschließender Sortierung nach XP.

Das klappt soweit auch schon.
> Hier zu sehen <
Allerdings möchte ich die "Spectator" an unterster Stelle den Rest der Sortierung aber beibehalten.
Im moment sind diese ganz oben.

Da ich mit nur einen vorhandenen Serverviewer erweitere und diese Funktion nur umgeschrieben habe fehlt mir der Durchblick was denn nun hinter den Variablen $a und $b steckt. Kann mir da jemand auf die Sprünge helfen?

Durch probieren bin ich soweit gekommen, allerdings komm ich nicht drauf wie ich team == "Spec" nach unten bekomme..
PHP:
function teamsort ($a, $b) {
	if (($a["team"] == $b["team"]) AND ($a["frags"] == $b["frags"])) {
		return 0;
	}
	if (($a["team"] == $b["team"]) AND ($a["frags"] > $b["frags"])) {
		return -1;
	}
	if (($a["team"] == $b["team"]) AND ($a["frags"] < $b["frags"])) {
		return 1;
	}
	if ($a["team"] > $b["team"]) {
		return -1;
	}
	if ($a["team"] < $b["team"]) {
		return 1;
	}
	if ($b["team"] == "Spec") {
		return -1;
	}
}
Aufgerufen wird über
PHP:
if (is_array($this->m_playerinfo)) {
	usort($this->m_playerinfo, "teamsort");
}

Vielen Dank schon mal im Voraus :)
 
Hi,
also wenn ich deine Funktion so nutze, dann sortiert er mir die Teams alphabetisch absteigend und die "Spec"s nach ganz unten.
Aus
Code:
"Spec", "abc1", "xyz2", "Spec", "xyz1", "abc2", "Spec"
wird also
Code:
    [0] => xyz2
    [1] => xyz1
    [2] => abc2
    [3] => abc1
    [4] => Spec
    [5] => Spec
    [6] => Spec
Die alphabetische Sortierung entspricht ja auch deiner Homepage (erst "Axis", dann "Allied"). Demnach sollten die "Spec"s doch auch schon jetzt nach unten kommen, oder?

Ich hab die Funktion jetzt so abgeändert:
PHP:
function teamsort ($a, $b) {
    if (($a["team"] == $b["team"]) AND ($a["frags"] == $b["frags"])) {
        return 0;
    }
    if (($a["team"] == $b["team"]) AND ($a["frags"] > $b["frags"])) {
        return -1;
    }
    if (($a["team"] == $b["team"]) AND ($a["frags"] < $b["frags"])) {
        return 1;
    }
    if ($a["team"] == "Spec") {
        return 1;
    }
    if ($b["team"] == "Spec") {
        return -1;
    }
    if ($a["team"] > $b["team"]) {
        return 1;
    }
    if ($a["team"] < $b["team"]) {
        return -1;
	}
}
Damit sortiert er obige Liste so:
Code:
    [0] => abc1
    [1] => abc2
    [2] => xyz1
    [3] => xyz2
    [4] => Spec
    [5] => Spec
    [6] => Spec
Das erscheint mir am sinnvollsten.

Hoffe das hilft.
 
Ganz das Ziel wars noch nicht, aber es hat mich entscheidend zum Ziel geführt :)

Das Problem war zum einen, dass ich nur $b["team"] auf Spec geprüft habe und zum anderen, dass die Prüfung auf Spec am Ende der Funktion war.

Funktionieren tuts jetzt so:

PHP:
function teamsort ($a, $b) {
	if (($a["team"] == $b["team"]) AND ($a["frags"] == $b["frags"])) {
		return 0;
	}
	if (($a["team"] == $b["team"]) AND ($a["frags"] > $b["frags"])) {
		return -1;
	}
	if (($a["team"] == $b["team"]) AND ($a["frags"] < $b["frags"])) {
		return 1;
	}
	if ($b["team"] == "Spec") {
		return -1;
	}
	if ($a["team"] == "Spec") {
		return 1;
	}
	if ($a["team"] > $b["team"]) {
		return -1;
	}
	if ($a["team"] < $b["team"]) {
		return 1;
	}
}

Danke nochmals :)
 
Zurück