Chce se to naučit funkce var_dump, takhle se to nedá číst. Případně do toho neplést html, a používat Content-type: text/plain. (nebo <PRE>). Když už masochismus, tak nl2br .
A Skutečně už žádné další hlubší vysvětlení není. Klíčové věci jsou, že při použítí as &$val opakovaně vzniká proměnná $val, která ukazuje na aktuální prvek (přesněji řečeno hodnotu prvku) ) a zůstane na posledním po skončení a že array_diff v tom vytváří rozdílové pole tak, že tam do hodnoty prvků přejímá jak jsou, takže i s referencemi.
A v dalším cyklu použití as $val znamená, do proměnné $val ulož něco.
Zdálo by se že řešení, je použít i v druhém cyklu taky as &$val, ale to jen odsune problém.
Kromě taky var_dump by ti ukázala, že u posledního prvku vstupA je symbol &, značící, že existuje reference na tento člen.
Právě reference jsou v programování nebezpečná věc, právě se to ukázalo, protože ty někde v kódu si vytvoříš referenci $val a s vstupAa pak někde kousek jinde použiješ $val v domění, že si vytváříš novou proměnnou...
Tím spíš v cyklech, tam dokonce střídavě $val se nastavuje na všechny prvky a zůstane na posledním...
Kromě toho je rozdíl mezi unset($val) a $val=null;
To znamená, že při druhém foreach opět dráždíš spícího hada,, probudil si hotím, že v každé iteraci se proměnné, které je dostupné jako $val a jako poslední prvek $vstup a ještě dokonce i jako $porovnani[8] přiřazuješ různé hodnoty. a tím měníš proměnou nikoli na 2,6,9, ale na 2, pak 6 , a v ttřetí iteraci přiřazuješ "proměnné stejnou proměnnnou " protože obě ukazují na stejnou hodnotu.