【问题标题】:PHP - string vs array comparisonPHP - 字符串与数组比较
【发布时间】:2014-01-03 07:35:35
【问题描述】:

我会发布一个问题,希望stackoverflow 管理员不要将此作为重复的主题,因为我找不到对此类事情的解释。

我们都知道,在类型杂耍之后,这个比较看起来像这样:

false == array() -> (bool) == false (bool) array() -> false == false -> true

到目前为止,没有什么异常。

问题是试图对这种事情寻求解释,但答案没有意义,然后似乎主题重复,但实际上它不是重复的主题。

问题是 php 如何解释下面的比较:

'' == array()

有人说:

“将空字符串转换为数组”

结果是: (array) '' == array() -> array('') == array() -> false

似乎是对的。

但最大的问题就在这里,如下:

'' == array('')

因为它不返回 true ?如果根据某种理论:

'' == array('') -> 这应该返回 true

'' == array('') -> (array)'' == array('') -> array('') == array('')

但是返回false。

你能一劳永逸地解释这个问题吗?

【问题讨论】:

  • 当数组与字符串比较时,数组更大。 (php.net/manual/en/…)
  • 简而言之:garbage in -garbage out 您应该首先决定为什么需要比较数组和字符串。我有 99% 的把握,在正常情况下,您总是会比较相同类型的实体
  • 乔尼,你能解释一下吗?
  • 糟糕,这是错误的语言链接,这里又是正确的:PHP type comparison tables
  • @user3151657 我的逻辑是,一个袋子可以装苹果var_dump(array() > "");,但一个苹果没有袋子var_dump("" > array()); 和一个array("") 甚至包含一个字符串var_dump(array("") > "");,就像一个装有苹果的袋子: D

标签: php


【解决方案1】:

tl;dr 在比较中不执行转换:

在内部,比较是通过compare_function 完成的,当解析器看到== 运算符时会调用它。

在此函数内部,根据每个操作数的类型进行测试;字符串和数组的组合没有特定的行为,因此尝试进行数字转换here

这两个操作数的尝试都失败了,因为空字符串不是数字,而数组也不是。然后它执行另一个测试here 以检查任何操作数是数组还是对象。如果是,则返回 -1 或 1,具体取决于匹配的操作数。

当然,这也记录在the manual中,以帮助那些不想破译源代码的人:)

【讨论】:

  • 我认为所有可能的比较类型都有规则。我所理解的是,它总是对权重更大的变量类型进行一次强制转换。但我喜欢这个解释。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-02
  • 1970-01-01
  • 1970-01-01
  • 2021-06-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多