Sven Rautenberg: zu blöd für Arrays....

Beitrag lesen

Yo!

Ich kommentiere das mal:

$query = "SELECT * FROM produkte";
$res = mysql_query($query, $link);

// Eine SQL-Abfrage wird gestartet...

$haystack=array();

// Definition einer noch leeren Array-Variablen

while($row=mysql_fetch_array($res)){

// Solange die Datenbank Daten hergibt, weise jede Ergebniszeile als Mischarray der Variablen $row zu.

$haystack[]=$row[0];

// Hänge ans Ende der Variablen $haystack den Wert der ersten Spalte der SQL-Abfrage. Es ergibt sich eine Liste in einem Array. [*1]

echo $row[0]."<br>";}

// Kontrollweise Ausgabe

#$belegt=array("a" => $haystack);

// Das ist auskommentiert, und dessen Sinn behandle ich gleich. [*2]

$belegt= array ("a" => 1, 2, 2, 3, 5);
$plaetze = array ("b" => 1, 2, 3, 4, 5, 6);

// Definition zweier Misch-Hashs-Arrays. [*3]

$result = array_diff($plaetze,$belegt);

// Die fragliche Differenzbildung. [*4]

Kommentare zu den Anmerkungen:
[*1]
Das ist eine trickreiche Funktion, die man einfach kennen muß: Wenn ein Array exitiert, kann man mit $arrayname[1] einzelne, definierte ELemente ansprechen, oder mit $arrayname[] am Ende des Arrays ein neues Element erzeugen. Es hat dann einen Index, der um 1 größer ist als der bisher größte Index.

[*3]
Deine Arraydefinition ist fehlerhaft. Die Frage ist doch: Was macht das "a" dort? Ein Variablenname kann es nicht sein, denn der lautet $belegt oder $plaetze. Lösung: Du definierst hier einen Hash-Eintrag! Du kannst mit $belegt['a'] auf die Variable zugreifen und erhälst als Ergebnis die zugewiesene 1. Außerdem definierst du noch vier weitere Einträge, die aber nur als Arrayindices eingetragen werden - von Anfang an, also beginnend bei Null.
$belegt= array ("a" => 1, 2, 2, 3, 5); erzeugt:
['a'] = 1
[0] = 2
[1] = 2
[2] = 3
[3] = 5

[*2]
Entsprechend ist diese Zuweisung völliger Schwachsinn, wenn du ein Array $haystack behalten willst. Das, was diese Anweisung macht, ist:
Erzeuge eine Variable $belegt, trage den Hashwert "a" ein und weise als Wert ein Array zu.

Zugreifen könntest du auf die Einzelwerte dann als $belegt['a'][0] - ist aber nicht das, was du willst, oder?

[*4]
Für die Differenz der Arrays kommt es nur auf den Inhalt an. Es ist egal, ob eine gespeicherte "2" den Index 3, 0 oder "a" hat. Aber entscheidend ist: Was bleibt im Array übrig. Wenn deine Indices nicht stimmen, kriegst du fehlerhafte Ergebnisse.

Ich bin der festen Überzeugung, daß $haystack ein wunderbares, mit Zahlen indiziertes Array ist, welches du direkt verwenden kannst. Ebenso erzeugt $platz = array (1,2,3,4,5,6,7,8,9,10) ein gleichartiges, ebenfalls zahlenindiziertes Array.

Großes PS: Wenn du wissen willst, was in den Variablen drinsteht, nimm die Funktion "var_dump":

var_dump($belegt); hätte dir gleich gezeigt, was du da definierst, nämlich Müll:
array(5) { ["a"]=> int(1) [0]=> int(2) [1]=> int(2) [2]=> int(3) [3]=> int(5) }

- Sven Rautenberg