PHP中的in_array - 行为异常

4

不确定为什么会发生这种情况,但是我的脚本似乎无法多次返回in_array的true值...

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

然后,我查询数据库:

$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...

如果我打印 $demo,你会看到 vid 22 在其中,所以我不明白为什么状态没有相应地设置?
    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
                    )
        )

)

请注意,我还尝试在 $set 上使用 array_intersect 和 array_flip,然后使用 isset...。

1
可能会有一些空格或其他不可见字符弄乱了代码。你能使用 var_dump 而不是 print_r 吗?它会在字符串周围加上引号并告诉我们变量的数量。 - Samir Talwar
2
如果在“in_array”行之前立即添加“var_dump($r ['vid'],$set)”,它会输出什么? - user187291
1
非常感谢...是的,$set 有一些不必要的空格,使用 trim 让它工作了...谢谢! - n00b0101
通常出于性能原因,我会建议使用关联数组而不是 in_array$set = array_flip(explode(',', $saved)); ... if (isset($set[$r['vid']]))), 但 $set 是如此简短,这不会有太大的差异;对于仅有几个元素,使用 in_array 可能甚至更快。另一种方法是在查询中设置状态: SELECT did,vid,iid,value, vid IN ($saved) AS status FROM demographicValues;. - outis
@Sterofrog和@n00b0101:建议将评论重新发布为答案,并选择为正确答案,这样问题就不会再显示为未回答。 - JYelton
1个回答

2
默认情况下,in_array 也会检查类型。请参阅参数 strict,详情请见 http://php.net/manual/en/function.in-array.php
在您的代码中,$r['vid'] 是一个整数,而分解后的字符串仍然是一个字符串。因此,请使用相同的类型或者使用:
if(in_array($r['vid'], $set, false)) ...

默认情况下,PHP 不会检查类型。 - knittl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接