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