Moin!
echo "A WERT: " . $_POST['A'][$i] . "<br>";
echo "A ARRAY:";var_dump($_POST['A']);echo "<br>";
if(array_search($_POST['A'][$i],$_POST['A'])) {
array_search liefert dir entweder den ersten passenden Key zurück, der auf dein Suchelement zutrifft, oder (bool) false.
Wenn du in deinem Array nun nach Werten suchst, die du aus diesem Array entnimmst, dann muss array_search immer etwas finden.
Und das tut es auch. Es liefert dir, wenn du nach "3" suchst, den zugehörigen Key zurück: Die Zahl 0. Und diese Zahl 0 wird in deiner IF-Abfrage als "false" behandelt, weil du nicht explizit mit dem Äquivalenzoperator === mit false vergleichst, sondern Typecasting erlaubst.
Deshalb kriegst du einmal "draußen" als Ausgabe, obwohl dreimal "drinnen" das Resultat wäre.
A WERT: 3
A ARRAY:array(3) { [0]=> string(1) "3" [1]=> string(1) "1" [2]=> string(1) "2" }
draußen
Wie ihr seht, unterscheiden sich lustigerweise alle Werte. 3 ist angeblich NICHT im array, während die anderen beiden drinnen sind ... Was ist da falsch? Ich muss ja nur rauskriegen, ob sie drinnen sind, um zu verhindern, dass Werte doppelt existieren.
array_search wird dich nicht weiterbringen, wenn es darum geht, Werte, die im Array sind, im Array zu finden - denn das wird immer klappen.
Was du willst ist, Werte, die im Array sind, nicht doppelt zu haben. array_unique() macht dir das in deinem Array, danach hast du nichts doppelt mehr.
Und wenn du nur wissen willst, ob im Array doppelte Werte sind, dann vergleichst du die Keys, die in den Array sind einmal vor und einmal nach Behandlung durch array_unique(). Die zugehörige Funktion ist array_keys().
if (array_keys($_POST["A"]) === array_keys(array_unique($_POST["A"]))) {
//nix doppelt
}
Mit array_keys() könntest du ebenfalls ermitteln, welche Keys existieren zu einem angegebenen Suchwert, und wenn es derer mehr als einen gibt, wäre das "böse". Wäre aber auch wieder eine Schleife, die du durchlaufen müsstest.
- Sven Rautenberg