1

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

看下面的代码行..

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 数组中搜索对象。但相反,它返回真!!!!怎么会这样?????

4

2 回答 2

2

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

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

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

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

于 2013-07-06T06:02:16.907 回答
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))

编辑:我想我知道你如何自己找到问题。我刚刚发现了这个问题。尝试将 in_array() 更改为第一个答案的 foreach() 的形式,但是return TRUE;像这样更改以查看它带来了什么:

foreach ($clones[$j]->defendAgainst as &$member) {
  if ($member == $_SESSION['enemies'][$i]) {
    var_dump($_SESSION['enemies'][$i]);
    var_dump($member);
  }
}
于 2013-07-06T05:43:18.537 回答