array_search und das verschwundene Element

Hallo,

Bei meinen Recherchen zur PHP-Referenz bin ich auf ein Problem bei der Funktion array_search gestoßen.

Anscheinend ignoriert diese Funktion bei der Suche das erste Element eines Arrays.

Beispiel:


<?php

$tage 
= array(54321);
$suche 4;

if(
$ergebnis array_search($suche$tage)){
    echo 
$tage[$ergebnis]." ist enhalten!<br/>";
}
else{
    echo 
$suche." ist <b>nicht</b> enthalten!<br/>";
}

$suche 5;

if(
$ergebnis array_search($suche$tage)){
    echo 
$tage[$ergebnis]." ist enhalten!";
}
else{
    echo 
$suche." ist <b>nicht</b> enthalten!";
}

?>

Ausgabe:

4 ist enhalten!
5 ist nicht enthalten!

Vertausche ich die beiden Elemente, so wird die 5 gefunden, aber nicht die 4.

Wie nachfolgend zu sehen, das gleiche Problem bei Daten vom Typ String


<?php

$tage 
= array("Montag""Dienstag""Mittwoch");
$suche "Dienstag";

if(
$ergebnis array_search($suche$tage)){
    echo 
$tage[$ergebnis]." ist enhalten!<br/>";
}
else{
    echo 
$suche." ist <b>nicht</b> enthalten!<br/>";
}

$suche "Montag";

if(
$ergebnis array_search($suche$tage)){
    echo 
$tage[$ergebnis]." ist enhalten!";
}
else{
    echo 
$suche." ist <b>nicht</b> enthalten!";
}

?>

Ausgabe:

Dienstag ist enhalten!
Montag ist nicht enthalten!

Test mit der Option strict:

<?php

$tage 
= array("Montag""Dienstag""Mittwoch");
$suche "Dienstag";

if(
$ergebnis array_search($suche$tagetrue)){
    echo 
$tage[$ergebnis]." ist enhalten!<br/>";
}
else{
    echo 
$suche." ist <b>nicht</b> enthalten!<br/>";
}

$suche "Montag";

if(
$ergebnis array_search($suche$tagetrue)){
    echo 
$tage[$ergebnis]." ist enhalten!";
}
else{
    echo 
$suche." ist <b>nicht</b> enthalten!";
}

?>

Ausgabe:

Dienstag ist enhalten!
Montag ist nicht enthalten!

Habt ihr schon ähnliche Erfahrungen gemacht?

Eine Lösung wäre, an den Anfang des zu duchsuchenden Arrays ein blindes Element hinzuzufügen:


<?php

$tage 
= array("Montag""Dienstag""Mittwoch");
array_unshift($tage," ");
print_r ($tage);
echo 
"<br />";

$suche "Dienstag";

if(
$ergebnis array_search($suche$tagetrue)){
    echo 
$tage[$ergebnis]." ist enhalten!<br/>";
}
else{
    echo 
$suche." ist <b>nicht</b> enthalten!<br/>";
}

$suche "Montag";

if(
$ergebnis array_search($suche$tagetrue)){
    echo 
$tage[$ergebnis]." ist enhalten!";
}
else{
    echo 
$suche." ist <b>nicht</b> enthalten!";
}

?>

Ausgabe:

Array ( [0] => [1] => Montag [2] => Dienstag [3] => Mittwoch )
Dienstag ist enhalten!
Montag ist enhalten!

Jetzt funktioniert die Funktion!

Zu bedenken ist, dass ich dann allerdings die Schlüssel auch verschiebe. Eventuell ist es daher ratsam, das zu untersuchende Array in ein Prüfarray zu kopieren und dort das Element anzufügen.

Test mit Schlüsseln:


<?php

$tage 
= array("tag1" => "Montag""tag2" => "Dienstag""tag3" => "Mittwoch");

$suche "Dienstag";

if(
$ergebnis array_search($suche$tagetrue)){
    echo 
$tage[$ergebnis]." ist enhalten!<br/>";
}
else{
    echo 
$suche." ist <b>nicht</b> enthalten!<br/>";
}

$suche "Montag";

if(
$ergebnis array_search($suche$tagetrue)){
    echo 
$tage[$ergebnis]." ist enhalten!";
}
else{
    echo 
$suche." ist <b>nicht</b> enthalten!";
}

?>

Ausgabe:

Dienstag ist enhalten!
Montag ist enhalten!

Auch das funktioniert.

Numerische Schlüssel:


<?php
$tage 
= array(=> "Montag"=> "Dienstag"=> "Mittwoch");

$suche "Dienstag";

if(
$ergebnis array_search($suche$tagetrue)){
    echo 
$tage[$ergebnis]." ist enhalten!<br/>";
}
else{
    echo 
$suche." ist <b>nicht</b> enthalten!<br/>";
}

$suche "Montag";

if(
$ergebnis array_search($suche$tagetrue)){
    echo 
$tage[$ergebnis]." ist enhalten!";
}
else{
    echo 
$suche." ist <b>nicht</b> enthalten!.<br>";
}

echo 
"Ergebnis, wenn ich das Element direkt anpreche --> ".$tage[0];

?>

Ausgabe:

Dienstag ist enhalten!
Montag ist nicht enthalten!.
Ergebnis, wenn ich das Element direkt anpreche --> Montag

Anscheinend liegt hier tatsächlich ein Fehler vor und man hat array_search() bei 1 und nicht bei 0 beginnen lassen.

Bei php.net habe ich zwar einen Hinweis gefunden, der sich allerdings auf den Rückgabewert bezieht.

Dazu ein Test:

<?php
$tage 
= array(=> "Montag"=> "Dienstag"=> "Mittwoch");

$suche "Dienstag";

if(
$ergebnis array_search($suche$tagetrue)){
    echo 
"Ergebnis:".$ergebnis."!<br/>";
}

$suche "Montag";

if(
$ergebnis array_search($suche$tagetrue)){
    echo 
"Ergebnis:".$ergebnis."!<br/>";
}

?>

Ausgabe:

Ergebnis:1!

Ich würde mich über Infos von eurer Seite zu diesem Problem freuen! Hier könnt ihr Kontakt mit mir aufnehmen!


« zurück