4

Not sure why this is happening, but my script doesn't seem to be able to return true for in_array more than once...

$saved = '15,22';    
$set = explode(",",$saved); //results in Array ( [0] => 15 [1] => 22 ) 

Then, I query the database:

$result = pg_query("SELECT did,vid,iid,value FROM demographicValues");
if(pg_num_rows($result) > 0) {
  while($r = pg_fetch_array($result)) {
     $demo[$r['did']][$r['vid']]['value'] = $r['value'];
     if(in_array($r['vid'], $set)) {
       $demo[$r['did']][$r['vid']]['status'] = 1;
     }
  }
} else...

If I print_r $demo, you can see that the vid 22 is in there, so, I'm not understanding why the status isn't being set accordingly?

    Array
    (
        [Mant] => Array
            (
                [15] => Array
                    (
                        [value] => Proper
                        [checked] => 1
                    )

                [16] => Array
                    (
                        [value] => Parish
                    )
        [Comp] => Array
            (
                [22] => Array
                    (
                        [value] => 65 - 70
                    )

                [23] => Array
                    (
                        [value] => 35 - 50
                    )
        )

)

Note that I also tried array_intersect and array_flip on $set, then isset...

5
  • 1
    There may be some spaces or other invisible characters messing up the code. Can you use var_dump rather than print_r? It'll put quotes around the strings and tell us the number of variables. Commented Mar 30, 2010 at 13:08
  • 2
    if you add var_dump($r['vid'], $set) immediately before 'in_array' line - what does it say? Commented Mar 30, 2010 at 13:10
  • 1
    Thank you so much... Yes, the $set did have some unnecessary spaces, and using trim got it to work... Thanks! Commented Mar 30, 2010 at 13:11
  • normally, I'd recommend using an associative array over in_array for performance reasons($set = array_flip(explode(',', $saved)); ... if (isset($set[$r['vid']]))), but $set is so short it won't make much of a difference; in_array might even be faster for just a few elements. Another approach is to set the status in the query: SELECT did,vid,iid,value, vid IN ($saved) AS status FROM demographicValues; Commented Mar 30, 2010 at 13:30
  • @Sterofrog and @n00b0101: suggest reposting comment as answer and select as correct answer so the question no longer shows up on unanswered. Commented Apr 16, 2010 at 20:52

1 Answer 1

2

By default in_array also checks the types. See the parameter strict at http://php.net/manual/en/function.in-array.php.

In your code $r['vid'] is an integer and the exploded string is still a string. So just use the same types or use:

if(in_array($r['vid'], $set, false)) ...
Sign up to request clarification or add additional context in comments.

1 Comment

by default php will not check the types

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.