【问题标题】:php in_array - unexpected behaviorphp in_array - 意外行为
【发布时间】:2010-03-30 12:56:15
【问题描述】:

不知道为什么会这样,但我的脚本似乎无法多次为 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...

如果我 print_r $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...

【问题讨论】:

  • 可能有一些空格或其他不可见的字符弄乱了代码。你可以使用var_dump 而不是print_r 吗?它会在字符串周围加上引号并告诉我们变量的数量。
  • 如果您在 'in_array' 行之前添加var_dump($r['vid'], $set) - 它说明了什么?
  • 非常感谢...是的,$set 确实有一些不必要的空格,使用 trim 让它工作...谢谢!
  • 通常,出于性能原因,我建议在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;
  • @Sterofrog 和 @n00b0101:建议将评论重新发布为答案并选择正确答案,这样问题就不会再出现在未回答的情况下。

标签: php arrays


【解决方案1】:

默认情况下in_array 也会检查类型。 在http://php.net/manual/en/function.in-array.php 处查看参数strict

在您的代码中,$r['vid'] 是一个整数,而分解后的字符串仍然是一个字符串。所以只需使用相同的类型或使用:

if(in_array($r['vid'], $set, false)) ...

【讨论】:

  • 默认情况下php会检查类型
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-13
  • 2018-09-27
  • 2016-09-02
  • 2012-07-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多