Matthew
Matthew

Reputation: 683

in_array() doesn't work as expected with associative array

I don't know what's causing this issue, but I'll post the code below then go through what I've done so far and the results I've gotten.

$client_emails = array(
    '[email protected]' => null, // first array entry
    '[email protected]'   => 'page_two',
    '[email protected]' => 'page_three',
    '[email protected]' => null,
);

$form_email = '[email protected]';


if (!empty($form_email)) {
    if (isset($client_emails[$form_email])) {
         $client_page = $client_emails[$form_email];
    } else { $client_page = null; }
}

if (in_array($form_email, $client_emails)) {
 if (!is_null($client_page)) {
     echo 'All seems to be good! - ';
     echo $client_page;
 } else {
     echo 'You can not be here.';
 }
} else {
     echo "For some reason this isn't working... 'in_array' should be finding the email in the array.";
}

The above code is what I've been playing with, it does not work. It will work, however, if we change the value for the 'first array entry' (comment) from NULL to TRUE, like so:

$client_emails = array(
    '[email protected]' => true, // first array entry
    '[email protected]'   => 'page_two',
    '[email protected]' => 'page_three',
    '[email protected]' => null,
);

The whole thing technically works now, but TRUE is equal to 1 and now the rest of my script does not work properly because it will read that as a value of 1 and echo it. I need it to be NULL.

The 'first array entry' cannot be NULL or FALSE, the only value that works is TRUE. It can be empty IF the value for $form_email is equal to a key that does not have a value, if the key has a value and there is no value of TRUE for the first array key then the whole thing fails any ways.

Code to reproduce the issue

I don't understand what's happening. I have two questions:

  1. Any suggestions on how to get around this?
  2. If you could help me understand why this is happening -- maybe I'm doing something wrong?

EDIT:

I've also tried the following:

$client_emails = array(
    '[email protected]' => 'null', // first array entry
    '[email protected]'   => 'page_two',
    '[email protected]' => 'page_three',
    '[email protected]' => 'null',
);

$form_email = '[email protected]';


if (!empty($form_email)) {
    if (isset($client_emails[$form_email])) {
         $client_page = $client_emails[$form_email];
    } else { $client_page = null; }
}

if (in_array($form_email, $client_emails)) {
 if (!empty($client_page) && $client_page != 'null') {
     echo 'All seems to be good! - ';
     echo $client_page;
 } else {
     echo 'You can not be here.';
 }
} else {
     echo "For some reason this isn't working... 'in_array' should be finding the email in the array.";
}

Upvotes: 3

Views: 2501

Answers (3)

Sougata Bose
Sougata Bose

Reputation: 31749

You are comparing $form_email with the values of $client_emails.

if (in_array($form_email, $client_emails)) {

$form_email should be compared with the keys of $client_emails, not values. - Try with -

if (in_array($form_email, array_keys($client_emails))) {

Or check for the existence of they -

if(array_key_exists($form_email, $client_emails)) {

Upvotes: 0

Touqeer Shafi
Touqeer Shafi

Reputation: 5274

Why don't you use array_key_exists

if(array_key_exists($form_email, $client_emails)){

}

Upvotes: 2

Rizier123
Rizier123

Reputation: 59701

Your problem is your if statement:

if (in_array($form_email, $client_emails))

Here you search the email in the values ([NULL, "page_two", "page_three", NULL]), but you need to look into the keys (["[email protected]", ..., "[email protected]"]), so just use array_keys(), e.g.

if (in_array($form_email, array_keys($client_emails)))
                        //^^^^^^^^^^^ See here, so you serach the email in the keys

Upvotes: 3

Related Questions