Moin!
Warum läßt du im foreach $val erzeugen, wenn du es nicht nutzt?
Wie erzeugt man denn im Foreach $key, ohne dass $val erzeugt wird?
Man benutzt $val einfach.
Das Problem sind nicht die Typos, sondern der grundlegende Programmieransatz.
Der ist super!
Nein, das ist vollkommen ernst gemeint.
Wenn Du es nicht glaubst, dann musst Du dich mal mit den Programmierern von PHP auseinandersetzen. Die sind da nämlich durchaus meiner Meinung. Ein Beispiel findest Du übrigens auch unter $_FILES.
Die Entgegennahme von Formulardaten ist etwas anderes, als das Erstellen und Verwalten eigener Daten im Array.
Ich hatte nämlich mal gefragt, warum das so "chaosmäßig" aufgebaut wäre und habe wohl ausnahmsweise mal einen Netten erwischt. Er hat mich aber "durch die Blume" als PHP-Laien bezeichnet, weil ich nicht sofort den Vorteil dieses Aufbaus gesehen habe. Das kannst Du Dir nun ersparen ;-))
Ich kann nur sagen: Der Mann hatte Recht.
Aber ich erkläre es dir (und Eddie und dem Rest der Welt) natürlich noch mal:
Gehen wir von "früher" aus: Wenn man da mehrere gleichnamige Formularfelder an PHP übergeben wollte, wurden die in HTML name="feldname[]" mit eckigen Klammern am Ende genannt, und PHP hat dann statt der gewöhnlichen Variablen $feldname ein Array $feldname angelegt, mit den Indizes [0]..[n] - je nachdem, wieviele Felder im Formular diesen Namen hatten.
Vorteil: Man kann einfach mit is_array($feldname) prüfen, ob arraymäßig Daten übergeben wurden (was auch bei einem einzigen Feld mit eckigen Klammern der Fall ist).
Dann kam die große register-globals-off-Revolution, und aus $feldname wurde $_POST['feldname']. Der Rest ist geblieben: Mehrfachfelder werden jetzt unter $_POST['feldname'][0..n] abgelegt.
Das gleiche passiert im Feld $_FILES. Die Bezeichnung aus dem name-Attribut taucht in der ersten Dimension wieder auf: $_FILES['feldname']. Da zu einem Dateiupload aber mehr gehört, als einfach nur einen einfachen String in dieser Variablen zu speichern, ist in diesem Arrayelement ein weiteres Array mit den Informationen zu Dateiname ['name'], Mimetyp ['type'], Größe ['size'], temporärem Dateinamen auf dem Server ['tmp_name'] und Fehlercode ['error'].
Werden in mehreren Dateiauswahlfeldern gleichen Namens (mit eckigen Klammern) mehrere Dateien hochgeladen, ist diese Tatsache wieder in der letzten Dimension des dann entstehenden Arrays zu finden. Man kann also einfach $_FILES['feldname']['tmp_name'] mit is_array() prüfen und weiß, ob man es mit mehreren Dateien oder nur mit einer zu tun hat. Die Vorgehensweise ist, auch im Vergleich zu $_POST (oder $_GET) vollkommen identisch. Und logisch.
Jetzt zu Eddies Problem: Da gibt es mehrere Datensätze gleichartigen Aufbaus, die sortiert werden sollen.
Dein Vorschlag war, zuerst die Bezeichnung des Feldes als Dimension zu wählen, und als zweite Dimension dann numeriert die Daten dieses Feldes.
Eddies Struktur ist genau umgekehrt: Die erste Dimension numeriert alle existierenden Datensätze durch, und die zweite Dimension unterscheidet dann die einzelnen Felder des einzelnen Datensatzes.
Aufgabe war, dass die Datensätze sortiert und ausgegeben werden sollen.
Warum ist Eddies Struktur besser? Weil man beim Sortieren einfach usort() benutzt, um das Array zu sortieren. Und weil man bei der Ausgabe des Arrays einfach foreach benutzen kann.
Sortieren:
usort($datenarray, 'cmp')
function cmp($a, $b)
{
return strcmp($a["urlName"], $b["urlName"]);
}
Ausgeben:
foreach ($datenarray as $element)
{
echo $element['urlName'];
echo $element['plainName'];
// ...und so weiter
}
Deine Lösung hingegen kann usort() gar nicht verwenden, sondern man muß array_multisort() benutzen. Denn die Beziehungen zwischen deinem $datenarray['urlName'][0] und $datenarray['plainName'][0] dürfen nicht auseinandergerissen werden. Eddie würde gern ['urlName'] sortiert haben - die dazugehörigen Elemente in ['plainName'] etc müssen natürlich beim Sortieren korrekt mitsortiert werden.
array_multisort ist außerdem in seiner Sortierfähigkeit stark eingeschränkt. ein natcasesort() ist damit nicht realisierbar!
Und auch bei der Ausgabe muß man sich - du hast es in deinem Code ja schon demonstriert - bei foreach etwas mehr verrenken, als es tatsächlich notwendig wäre.
- Sven Rautenberg