in_array比较两种不同的类型然后返回true

时间:2013-07-06 05:39:23

标签: php

我的手上有一个真正的谜......

看下面的代码行..

if (in_array($_SESSION['enemies'][$i], $clones[$j]->defendAgainst)) {
    ..
}

其中$ _SESSION ['enemies'] [$ i]是类似的对象:

object(skinhead)#4 (16) 
 {
 ["weapon"]=> object(bowieknife)#5 (2)
 { ["name":protected]=> NULL ["damage":protected]=> NULL }
 ["name"]=> string(8) "skinhead" 
 ["health"]=>string(3) "100"
 ["strength"]=> string(2) "10" 
 ["luck"]=> string(1) "2"
 ["money"]=>string(1) "0" 
 ["exp"]=> string(1) "0" 
 ["rank"]=> string(2) "20" 
 ["points"]=> string(1)"0" 
 ["location_id"]=> NULL 
 ["comboAttack"]=> int(2) 
 ["attackValue"]=> int(15) 
 ["attackType"]=> NULL 
 ["attackMessage"]=> string(198) "Enemy #1 pulls off a 2-hit combo.Enemy #1 slashes at you with a bowie knife.You defend.You lose 8 health.Enemy #1 slashes at you with a bowie knife." 
 ["target1"]=> NULL ["target2"]=> NULL }

和$ clones [$ j] - > defendAgainst是一个整数数组

现在in_array应该求值为false,因为它正在搜索int数组中的对象。但相反它返回真实!!!!怎么会这样?????

2 个答案:

答案 0 :(得分:2)

为了让php将对象与int进行比较,它会将对象强制转换为int,然后进行比较。

$new = (int) $someObject;
var_dump($new); // int 1
var_dump($new == 1); // true, obviously. 

in_array()默认使用==进行比较。

...我的魔法水晶球告诉我你的int数组包含一个值为1的整数。

答案 1 :(得分:1)

这是预期的输出,您需要将第三个值添加为TRUE以使其也比较类型,如in_array()的PHP手册中所示:

bool in_array ( mixed $needle , array $haystack [, bool $strict = FALSE ] )

第三个值默认为FALSE,但您可以通过简单的更改:

if (in_array($_SESSION['enemies'][$i], $clones[$j]->defendAgainst, TRUE))
编辑:我想我知道你怎么能自己找到问题。我刚刚找到this question。尝试将in_array()更改为第一个答案的foreach()形式,但是像这样更改return TRUE;以查看它带来的内容:

foreach ($clones[$j]->defendAgainst as &$member) {
  if ($member == $_SESSION['enemies'][$i]) {
    var_dump($_SESSION['enemies'][$i]);
    var_dump($member);
  }
}