Notatki PHP

prywatne zapiski na kamieniu

array_key_exists - sprawdza, czy podany klucz lub indeks istnieje w tablicy.

bool array_key_exists ( mixed $klucz , array $tablica )

array_key_exists() zwraca TRUE jeśli podany klucz jest znaleziony w tablicy. Klucz może być dowolną wartością możliwą dla indeksu tablicy. Funkcja szuka kluczy tylko w pierwszym wymiarze tablicy. Klucze zagnieżdżone w tablicach wielowymiarowych nie zostaną znalezione. Różnica w działaniu pomiędzy tą funkcją a isset() - isset() nie zwraca TRUE dla kluczy przypisanych do wartości NULL, podczas gdy array_key_exists() tak.       

 
$tablica = array('piąty' => 1, 'drugi' => 4);
if (array_key_exists('piąty', $tablica)) {
    echo "Element 'piąty' istnieje w tablicy.";
}

Otrzymamy: Element 'piąty' istnieje w tablicy,

 
$tablica = array('pierwszy' => null, 'drugi' => 4);
 
// zwraca false
$c = isset($tablica['pierwszy']);
 
    var_dump($c);
 
 
echo '<br>';
// zwraca true
$c = array_key_exists('pierwszy', $tablica);
 
 
    var_dump($c);

Otrzymamy ze względu na null:

 
bool(false) 
bool(true) 

 

Jeśli chcemy wykorzystać zalety wydajności isset () przy prawidłowym wykrywaniu elementu NULL, należy stosować:

 
if (isset(..) || array_key_exists(...))
{
...
}

W dodatku dla tablic posiadających ponad 100 kluczy, wykonywanie tej funkcji jest ekstremalnie wolne - wtedy warto poszukać alternatywnego rozwiązania, chocby na bazie innych funkcji: isset($array($key))

 

Często wymogiem prawidłowego zadziałania funkcji jest zresetowanie tablicy przed wywołaniem:

 
reset($array);
array_key_exists($needle,$array);

 

Przy użyciu tej funkcji należy zwrócić uwagę na swoistą zwodniczość istnienia kluczy, gdzie gdy wydaje się nam, że nasza tablica wygląda jak poniżej, lecz:

 
 
$array = array(null => 1, false => 2, true => 3, 4.6 => 4, "08" => 5, "8" => 6);
var_export($array);
echo '<br>';
echo "nnull is " . (array_key_exists(null, $array)'' : 'not ') . "a key.n";
echo '<br>';
echo 'false is ' . (array_key_exists(false, $array)'' : 'not ') . "a key.n";
echo '<br>';
echo 'true is ' . (array_key_exists(true, $array)'' : 'not ') . "a key.n";
echo '<br>';
echo '4.6 is ' . (array_key_exists(4.6, $array)'' : 'not ') . "a key.n";
echo '<br>';
echo '"08" is ' . (array_key_exists("08", $array)'' : 'not ') . "a key.n";
echo '<br>';
echo '"8" is ' . (array_key_exists("8", $array)'' : 'not ') . "a key.n";
echo '<br>';

wynikiem badania kluczy są trzy błędy oraz:

 
array ( '' => 1, 0 => 2, 1 => 3, 4 => 4, '08' => 5, 8 => 6, )
null is a key. 
false is not a key. 
true is not a key. 
4.6 is not a key. 
"08" is a key. 
"8" is a key. 

Tak więc należy zawsze na to uważać.

 

Weźmy na przykład adres strony pochodzący z formularza np. index.php?register

By ustalić, jaki parametr ma być brany pod uwagę, np. rejestracja czy może logowanie, czy też przekierowanie na stronę główną, wystarczy:

 
if( array_key_exists( 'home',$_GET ) ) {
    echo "Home - its where the heart is.";
} else if( array_key_exists( 'login',$_GET ) ) {
    echo "Login code here!";
} else if( array_key_exists( 'register',$_GET ) ) {
    echo "Register code here!";
} else {
    echo "Home - its where the heart is.";
}