我的手上有一个真正的谜......
看下面的代码行..
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数组中的对象。但相反它返回真实!!!!怎么会这样?????
答案 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);
}
}