1. Warum steht vor $array ein & ?
Wir hatten weiter oben ja schon geklärt, dass beim Übergeben einer Variable an eine Funktion eine zweite Variable für die Verwendung in der Funktion erstellt wird (in Zeile 11 anfangen zu lesen):
function ausgeben($variable)
{
// $variable ist jetzt eine Kopie von $text.
// Es existieren jetzt 2 Variablen mit identischem Wert
// aber unterschiedlichen Namen.
// Ausgabe und Ende des Programms.
print $variable;
}
// Hier beginnt der Programmablauf.
// $text wird ein Wert zugewiesen.
$text = "Hallo Welt!";
// $text wird an die Funktion "ausgeben übergeben.
// Das Programm geht in Zeile 1 weiter.
ausgeben($text);
Alles anzeigen
Durch das anlegen einer Kopie wird der Speicherbedarf für die entsprechende Variable verdoppelt. Außerdem haben Änderungen an $variable keinen Einfluss auf $text.
Mit dem kaufmännischen Und vor dem Parameter wird jetzt keine Kopie von der übergebenen Variable erstellt, sondern es wird mit einer Referenz auf diese gearbeitet. Das ist programmiertechnisch etwas umständlicher, bietet im Zusammenhang mit Arrays aber 2 Vorteile:
1. Es wird keine Kopie angelegt, bei sehr großen Daten (riesige Arrays z. B.) spart das viel Speicher
2. Änderungen am Array betreffen trotzdem das Original
Das ist auch oft eine Stolperfalle für Anfänger bei der forech Schleife. Mit der foreach Schleife kann man ein Array durchlaufen. Wenn man nun in der Schleife selbst auf jedes Element des Arrays z. B. strtoupper anwendet um alle Zeichen in Großbuchstaben zu ändern und das Array nach der Schleife verwendet, hat sich nichts geändert. Auch hier braucht man &.
Ist jedoch nicht ganz einfach zu verstehen und in typschwachen und hardwarefernen Sprachen wie PHP und JS braucht man das äußerst selten.
2. Was hat $desc = false für ein Nutzen?
Du siehst die Verwendung in Zeile 9 und 10 der Funktion. Anhand der Variable wird lediglich entschieden ob aufsteigend oder absteigend sortiert wird. Das siehst du auch am Ergebnis wenn true mit übergeben wird (siehe oben):
sort_array($array1);
print_r($array1); // 1, 3, 5, 7, 8, 19, 27
sort_array($array1, true);
print_r($array1); // 27, 19, 8, 7, 5, 3, 1
3. Warum hast du in einer for schleife noch eine for schleife ?
Das ist ein einfacher Algorithmus zur Sortierung (Selection Sort). Ich versuche das mal grob zu erklären.
Die erste Schleife fängt beim 1. Element an. Dann wird direkt die zweite Schleife gestartet. Diese fängt jetzt beim n+1-ten Element an, also bei 2, arbeitet sich durch alle verbleibenden Elemente und vergleicht das 1. mit dem aktuellen. Wenn das aktuelle Element dann kleiner (oder bei umgekehrter Reihenfolge größer) ist, wird es mit dem an der ersten Stelle getauscht. Wir können dann sicher sein, dass das erste Element das kleinste Vorkommen beinhaltet. Dann endet die 2. Schleife und die 1. springt zum zweiten Element über. So geht das weiter bis zum Schluss.
Oder einfach die Schritte für das gegebene Element. Das + zeigt die Position der ersten Schleife und das - die der zweiten. Es wird aufsteigend sortiert.
| 5 | 8 | 27 | 19 | 7 | 1 | 3 |
| + | - | | | | | |
8 ist größer als 5, nichts passiert.
| 5 | 8 | 27 | 19 | 7 | 1 | 3 |
| + | | - | | | | |
27 ist größer als 5, nichts passiert.
[...]
| 5 | 8 | 27 | 19 | 7 | 1 | 3 |
| + | | | | | - | |
1 ist kleiner als 5, die Zahlen werden vertauscht.
| 1 | 8 | 27 | 19 | 7 | 5 | 3 |
| + | | | | | | - |
3 ist größer als 1, nichts passiert.
| 1 | 8 | 27 | 19 | 7 | 5 | 3 |
| | + | - | | | | |
27 ist größer als 8, nichts passiert.
[...]
| 1 | 8 | 27 | 19 | 7 | 5 | 3 |
| | + | | | - | | |
7 ist kleiner als 8, tauschen.
| 1 | 7 | 27 | 19 | 8 | 5 | 3 |
| | + | | | | - | |
5 ist kleiner als 7, wieder tauschen.
| 1 | 5 | 27 | 19 | 8 | 7 | 3 |
| | + | | | | | - |
3 ist kleiner als 5, tauschen.
| 1 | 3 | 27 | 19 | 8 | 7 | 5 |
| | | + | - | | | |
19 ist kleiner als 27, tauschen.
Und so weiter...
Alles anzeigen
4. Mit $i/$j < sizeof($array) tust du ja alle daten im array sammeln ?
sizeof gibt mir die Anzahl der Elemente im Array. Wenn also die Zähl-Variable $i (in der 2. Schleife $j) die Anzahl der Elemente im Array erreicht, ist die Schleife beendet.
5. Bei der 2. for-schleife beim if-statement [...]
Fast. Hier findet der oben beschriebene Tausch statt. Weil man leider nicht einfach sagen kann $array[$i] soll jetzt $array[$j] beinhalten und umgekehrt, muss zwischendurch eine temporäre Variable (daher $tmp) angelegt werden um sich einen Wert zu merken. Das sieht vom Ablauf dann so aus:
Ursprung:
$array[i]: 5
$tmp:
$array[j]: 3
Schritt 1:
$array[i]: 5 ->
$tmp: 5 <-
$array[j]: 3
Schritt 2:
$array[i]: 3 <-
$tmp: 5
$array[j]: 3 ->
Schritt 3:
$array[i]: 3
$tmp: 5 ->
$array[j]: 5 <-
Alles anzeigen
6. Hast du 2 Arrays gemacht für klein zu groß und groß zu klein ?
Nein. Ich habe eins mit Integern und eins mit Strings erstellt. Dann das Integer-Array aufsteigend sortieren und ausgeben lassen, dann das aufsteigend sortierte Integer-Array absteigend sortieren und anzeigen lassen und dann das String-Array aufsteigend sortieren und anzeigen lassen.
Hoffentlich konnte ich alles verständlich rüberbringen Ansonsten frag weiter nach, der beste Weg sich zu entwickeln!