[PHP] Verschachteltes Array sotieren

P0stbote

LTdW 30k Master
Thread Starter
Mitglied seit
13.05.2010
Beiträge
1.493
Ort
Bremen
hallo, ich melde mich hier wieder mit einen PHP-Problem. Diesmal versuch ich ein verschachteltes Array zu sortieren. Gut, das klappt auch soweit ganz gut, allerdings stört mich das, dass die Großbuchstaben in einen "eigenen" Alphabet aufgelistet sind, genauso wie die Kleinbuchstaben. Zur Veranschaulichung:


Wenn ich allerdings es per natcasesort($info['server']['players']['list']) sotieren lasse, kommt das raus


Also, in meinen Alphabet kommt das "S" nach den "D" und nicht davor oO.

Aufbau des Arrays:

PHP:
Array
(
    [server] => Array
        (
            [ip] => 78.143.58.15
            [host] => ignored
            [hostname] => Liberty-Reallife.de
            [mode] => German Reallife
            [Karte] => San Andreas
            [passworded] => 
            [players] => Array
                (
                    [Momentan] => 66
                    [Maximal] => 184
                    [list] => Array
                        (
                            [0] => Array
                                (
                                    [nick] => Duke_1.0
                                    [score] => 12
                                )

                            [1] => Array
                                (
                                    [nick] => ]Ic3_T[
                                    [score] => 19
                                )

                            [2] => Array
                                (
                                    [nick] => dntey
                                    [score] => 10
                                )

                            [3] => Array
                                (
                                    [nick] => Ernie
                                    [score] => 15
                                )

                            [4] => Array
                                (
                                    [nick] => Alex1992
                                    [score] => 5
                                )

                            [5] => Array
                                (
                                    [nick] => Tobbe
                                    [score] => 1
                                )

                            [6] => Array
                                (
                                    [nick] => [AFK]Ghettonippel
                                    [score] => 3
                                )

                            [7] => Array
                                (
                                    [nick] => Ace
                                    [score] => 3
                                )

                            [8] => Array
                                (
                                    [nick] => BigDowner
                                    [score] => 6
                                )

                            [9] => Array
                                (
                                    [nick] => Dr.Joker
                                    [score] => 16
                                )

                            [10] => Array
                                (
                                    [nick] => Mr.Jesus
                                    [score] => 35
                                )
// usw.

Ich möchte nur die Namen sotieren lassen, dabei sollen die dazugehörigen Level's dabei bleiben. Hat da wer ne Lösung? Ich sitzt jetzt schon den ganzen Abend dran und bekomm's net hin... :(
 
Zuletzt bearbeitet:
Wenn Du diese Anzeige nicht sehen willst, registriere Dich und/oder logge Dich ein.
Bubblesort implementieren (ist sehr simple)

dann beim vergleich folgende Method von PHP verwenden:
PHP: strtolower - Manual

und dann eben beide werte austauschen


best regards
aelo

edit:

Code:
for($i = 0;$i<$server['players']['Momentan'];$i++)
{
  $exchanged = false;
  for($k = 0;$k<$server['players']['Momentan'] - $i - 1;$k++)
  {
     if(strtolower($server['players']['list'][$k]) > strtolower($server['players']['list'][$k+1]))
     {
        $exchanged = true;
        $swap = $server['players']['list'][$k];
        $server['players']['list'][$k] = $server['players']['list'][$k+1];
        $server['players']['list'][$k+1] = $swap;
     }
  }
  if($exchanged == true) { break; }
}

so in etwa, hab nur schon länger kein PHP-Code mehr geschrieben, also musst du ihn gegebenenfalls noch anpassen :-)
 
Zuletzt bearbeitet:
Hi,

ich könnte mir vorstellen, dass die in PHP eingebaute Funktion uasort schneller ist als eine Bubblesort-Funktion.
Außerdem gibts weniger Code:

PHP:
function cmp($Item1, $Item2) {
    return strcasecmp($Item1['nick'], $Item2['nick']);
}  
uasort($array['server']['players']['list'],"cmp");
Weiteres Beispiel aus einem früheren Thread von mir: klick

Mfg.
 
Zuletzt bearbeitet:
So, nach mehreren tagen schleifenlassen, hab ich mich mal wieder drangesetzt.

Ich hab mir mal das Script von aeon geschnappt und entsprechend angepasst:

PHP:
for($i = 0;$i<$info['server']['players']['Momentan'];$i++)
{
  $exchanged = false;
  for($k = 0;$k<$info['server']['players']['Momentan'] - $i - 1;$k++)
  {
     if(strtolower($info['server']['players']['list'][$k]) > strtolower($info['server']['players']['list'][$k+1]))
     {
        $exchanged = true;
        $swap = $info['server']['players']['list'][$k];
        $info['server']['players']['list'][$k] = $info['server']['players']['list'][$k+1];
        $info['server']['players']['list'][$k+1] = $swap;
     }
  }
  if($exchanged == true) { break; }
}


Ergebnis: 1000 Fehlermeldungen (Warning: strtolower() expects parameter 1 to be string, array given in C:\xampp\htdocs\sampsort.php on line 239) & ein unsortiertes Array, was (willkürlich?) zusammengewürfelt wurde.
Das Problem liegt anscheinend daran, dass das Scritp ein neues Array für jeden Spieler anlegt:
PHP:
                    [list] => Array
                        (
                            [0] => Array
                                (
                                    [nick] => RionKiller
                                    [score] => 7
                                )

Und genau daran scheitere ich leider, so wie mit den foreach Problem was ich vor einiger Zeit hatte. Kann mir bitte wer die passende Erleuchtung geben? :wink:
 
Hi,

meinen Post hast du gelesen ?
Da steht nämlich die Lösung komplett auf dem Präsentierteller.
Die 3 Zeilen Code musst du nur noch per c&p in dein Code einfügen, und schon funktioniert die Sortierung wie von dir gewünscht. :rolleyes::rolleyes:

Habs sogar mit deinem array von oben getestet, funktioniert perfekt:
PHP:
<?php
$array = array
(
    "server" => Array
        (
            "ip" => '78.143.58.15',
            "host" => "ignored",
            "hostname" => "Liberty-Reallife.de",
            "mode" => "German Reallife",
            "Karte" => "San Andreas",
            "passworded" => '',
            "players" => Array
                (
                    "Momentan" => 66,
                    "Maximal" => 184,
					"list" => Array
                        (
                            "0" => Array
                                (
                                    "nick" => "Duke_1.0",
                                    "score" => 12
                                ),

                            "1" => Array
                                (
                                    "nick" => "]Ic3_T[",
                                    "score" => 19
                                ),

                            "2" => Array
                                (
                                    "nick" => "dntey",
                                    "score" => 10
                                ),

                            "3" => Array
                                (
                                    "nick" => "Ernie",
                                    "score" => 15
                                ),

                            "4" => Array
                                (
                                    "nick" => "Alex1992",
                                    "score" => 5
                                ),

                            "5" => Array
                                (
                                    "nick" => "Tobbe",
                                    "score" => 1
                                ),

                            "6" => Array
                                (
                                    "nick" => "[AFK]Ghettonippel",
                                    "score" => 3
                                ),

                            "7" => Array
                                (
                                    "nick" => "Ace",
                                    "score" => 3
                                ),

                            "8" => Array
                                (
                                    "nick" => "BigDowner",
                                    "score" => 6
                                ),

                            "9" => Array
                                (
                                    "nick" => "Dr.Joker",
                                    "score" => 16
                                ),

                            "10" => Array
                                (
                                    "nick" => "Mr.Jesus",
                                    "score" => 35
                                )
						)
				)
		)
);
echo 'vorher: <pre>';
print_r($array);
echo '</pre><br><br><br>';

function cmp($Item1, $Item2) {
    return strcasecmp($Item1['nick'], $Item2['nick']);
}  
uasort($array['server']['players']['list'],"cmp");

echo 'nacher: <pre>';
print_r($array);
echo '</pre><br><br><br>';
?>

Wenn du dir aber zuerst noch eine eigene Bubble-Sort-Funktion bauen willst, dein Quelltext aufblähen willst und den PHP-Interpreter unnötig kräftig arbeiten lassen willst, kannst du das natürlich machen.
Halte ich aber für wenig Sinnvoll.

Edit: kein problem ;)
Mfg.
 
Zuletzt bearbeitet:
Boar, alter, du bist mein Gott :hail:
Auf einmal hat dein Script funktioniert. Bei früheren versuchen, hat das immer undefinierbaren Schrott ausgegeben. Endlich funzt das so wie es soll und ich kann es endlich an meinen "Auftragsgeber" weiterleiten.

Nochmals vielen dank :hail:
 
Hardwareluxx setzt keine externen Werbe- und Tracking-Cookies ein. Auf unserer Webseite finden Sie nur noch Cookies nach berechtigtem Interesse (Art. 6 Abs. 1 Satz 1 lit. f DSGVO) oder eigene funktionelle Cookies. Durch die Nutzung unserer Webseite erklären Sie sich damit einverstanden, dass wir diese Cookies setzen. Mehr Informationen und Möglichkeiten zur Einstellung unserer Cookies finden Sie in unserer Datenschutzerklärung.


Zurück
Oben Unten refresh