【问题标题】:array_search return wrong key [duplicate]array_search 返回错误的键[重复]
【发布时间】:2016-06-09 13:31:47
【问题描述】:

我有这个数组:

$ar = [ 'key1'=>'John', 'key2'=>0, 'key3'=>'Mary' ];

如果我写:

$idx = array_search ('Mary',$ar);
echo $idx;

我明白了:

key2

我在网上搜索过,这不是孤立的问题。似乎当关联数组包含 0 值时,如果未设置严格参数,array_search 将失败。

还有不止一个bug warnings,都被动机拒绝:“array_search() 默认做一个松散的比较”。

好的,我用严格的参数解决了我的小问题……

但我的问题是:在松散比较 'Mary'==0'two'==0 或者这只是另一个 php 疯狂时,有一个体面、正当的理由?

【问题讨论】:

  • 我认为它在获得第一个等于时会停止搜索。如果将key3 放在key2 之前($ar = [ 'key1'=>'John', 'key3'=>'Mary', 'key2'=>0];array_search 将返回key3
  • array_search()手册中所说...如果搜索需要严格,则需要设置第3个参数...
  • @Naruto 是的,我把它写在我的问题中。我的问题是关于“为什么?”,而不是“如何”......
  • @LVameda 因为任何字符串的 int 都等于零
  • 严格比较不使用 == 它使用 === ...这基本上就是严格的意义..

标签: php arrays


【解决方案1】:

您需要将第三个参数设置为true才能使用严格比较。请看下面的解释:

array_search 在搜索过程中使用== 比较值

形成 PHP 文档

如果第三个参数 strict 设置为 TRUE,则 array_search() 函数将在 haystack 中搜索相同的元素。这意味着它还将检查大海捞针的类型,并且对象必须是相同的实例。

因为第二个元素是0,所以在搜索过程中字符串被转换为0

简单测试

var_dump("Mary" == 0); //true
var_dump("Mary" === 0); //false

解决方案使用strict 选项搜索相同的值

$key = array_search("Mary", $ar,true);
                                  ^---- Strict Option
var_dump($key);

输出

string(4) "key3"

【讨论】:

  • 很好的解释....
  • 救生员.... :)
【解决方案2】:

数组中有一个 0(零)数值,array_search() 默认执行非严格比较 (==)。 0 == 'Mary' 为真,您应该将第三个参数传递给array_search() (true)。

【讨论】:

    【解决方案3】:

    您只是在'key2'=>'0' 中的数组中进行更改,您没有给出单引号或双引号

    $ar = [ 'key1'=>'John', 'key2'=>'0', 'key3'=>'Mary' ];
    

    一切正常

    【讨论】:

    • 您实际上是将整数转换为字符串,这是一种错误的方法。
    【解决方案4】:
      $ar = [ 'key1'=>'John', 'key2'=>'0', 'key3'=>'Mary' ];
    

    【讨论】:

    • 您实际上是将整数转换为字符串,这是一种错误的方法。
    猜你喜欢
    • 1970-01-01
    • 2012-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-20
    • 1970-01-01
    相关资源
    最近更新 更多