【问题标题】:in_array comparing two different types and yet returning truein_array 比较两种不同的类型,但返回 true
【发布时间】:2013-07-06 05:39:23
【问题描述】:

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

看下面几行代码..

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

【问题讨论】:

  • 请让您的问题可读。
  • 怎么看不懂?....
  • @user2361103:您的对象都在一行中。
  • 对象的内容并不是我的问题的重点......重点是对象不是 int,我包含了 var_dump 以强调这一事实......

标签: php


【解决方案1】:

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

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

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

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

【讨论】:

  • +1 和大声笑,我已经做了很多次if ($Obj) { /* Something */ },我不知道我怎么没看到它。
【解决方案2】:

这是预期的输出,您需要添加第三个值为 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);
  }
}

【讨论】:

  • 但它首先是如何返回 true 的,为了返回 true,它必须比较 SOMETHING ......这就是我的困惑!
  • 完全正确,我给了我的 2 美分,但我不知道如何回答第二部分。我在答案中对此进行了编辑。
  • 感谢您的接受,但您也可以评论一下吗?现在我也很好奇(;
  • stackoverflow.com/questions/7669589/… 关于第三个变量的初始答案是正确的,但它仍然没有解释为什么它返回 true...
  • 这很有趣,因为我实际使用过但没有看到它。
猜你喜欢
  • 1970-01-01
  • 2018-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-24
  • 2019-08-18
  • 2013-05-13
  • 1970-01-01
相关资源
最近更新 更多