2013-07-06 48 views
0

我有我的手真正的奥秘..in_array比较两种不同类型,但返回true

看哪下面的代码行..

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

其中$ _SESSION [“敌人”] [ $ 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 } 

和$克隆[$ J] - > defendAgainst是整数数组

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

+1

请让你的问题可读。 – Starx

+0

它不可读?.... – user2361103

+0

@ user2361103:您的对象全部位于同一行中。 – Blender

回答

2

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

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

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

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

+0

+1和哈哈,我已经完成if($ Obj){/ * Something * /}',我不知道我是怎么看不到它的。 –

1

这是预期的输出,你需要添加为TRUE,使其也比较类型的第三值,因为可以在PHP手册中看到了in_array()

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); 
    } 
} 
+0

但它是如何返回真正的第一位,为了回报真实,它必须比较SOMETHING ....这是我所困惑的! – user2361103

+0

完全正确,我给了我2美分,但我不知道如何回答第二部分。我在答案中编辑这个。 –

+0

谢谢您的接受,但您能评论吗?现在我也很好奇(; –