我最近发现在我的代码中使用array_search函数时遇到了麻烦。我正在搜索数组“$ allcraftatts”的值为“sharp”。我尝试通过设置两行实验来解决问题:
$testcopy=$allcraftatts;
$testsharp=array_search("sharp", $testcopy);
使用“print_r(get_defined_vars());”后来,我得到了这个结果:
[testcopy] => Array
(
[0] => 0
[1] => 0
[2] => 0
[3] => 0
[4] => 0
[5] => 0
[6] => Sharp Stone
[7] => Sharp Stones
[8] => stone
[9] => object
[10] => sharp
[11] => hard
[12] => 0
[13] => 0
[14] => 0
[15] => 0
[16] => 0
[17] => 0
[18] => 0
)
[testsharp] => 0
我确保我不会在任何其他时间修改这些变量。
现在,如果我将代码更改为
$testcopy=$allcraftatts;
unset($testcopy[0]);
$testsharp=array_search("sharp", $testcopy);
它返回“1”。
这让我相信它总是会返回数组中的第一个键。
让我感到困惑!这是一个让你害怕语言本身出错的错误之一。不管这是多么令人怀疑,我实际上最终还是被迫在那里看错了PHP源代码,但遗憾的是无法理解它。
看到这是一个简单的功能,我绝对会被不可避免的简单回答完全羞辱,但在这一点上,我只想要一个答案。
答案 0 :(得分:8)
array_search
正在使用==
来比较搜索期间的值
FORM PHP DOC
如果第三个参数strict设置为TRUE,那么array_search()函数将在haystack中搜索相同的元素。这意味着它还将检查大海捞针中的针的类型,并且对象必须是同一个实例。
第一个元素是0
,在搜索过程中字符串被转换为0
简单测试
var_dump("sharp" == 0); //true
var_dump("sharp" === 0); //false
解决方案使用strict
选项搜索相同的值
$testsharp = array_search("sharp", $testcopy,true);
^---- Strict Option
var_dump($testsharp);
输出
10
答案 1 :(得分:2)
如果搜索到的密钥之前的任何密钥是数字零,则返回该密钥,因为它正在执行"松散"匹配由数组数据类型支配," sharp" (如果转换为int
)计为零。使用严格检查,找到正确的值。
否则,执行
$testcopy = array_map('strval', $testcopy);
以便将值转换为字符串,它也适用于"松散"检查。
答案 2 :(得分:1)
欢迎来到松散打字的精彩世界。在php中,array_search默认为非严格比较(“==”),但您可以添加第三个参数来强制严格(“===”)。你几乎总是想要严格,尽管有时候nonstrict是正确的操作。
查看以下内容:
$allcraftatts = array(0, 0, 0, 0, 0, 0, "Sharp Stone", "Sharp Stones", "stone", new stdClass(), "sharp", "hard", 0, 0, 0, 0, 0,0 ,0);
$testcopy=$allcraftatts;
$testsharp=array_search("sharp", $testcopy);
$testsharpStrict=array_search("sharp", $testcopy, true);
print_r(get_defined_vars());
if(0 == "sharp"){
echo "true for == \n";
}else{
echo "false == \n";
}
if(0 === "sharp"){
echo "true for === \n";
}else{
echo "false === \n";
}
和输出:
[testcopy] => Array
(
[0] => 0
[1] => 0
[2] => 0
[3] => 0
[4] => 0
[5] => 0
[6] => Sharp Stone
[7] => Sharp Stones
[8] => stone
[9] => stdClass Object
(
)
[10] => sharp
[11] => hard
[12] => 0
[13] => 0
[14] => 0
[15] => 0
[16] => 0
[17] => 0
[18] => 0
)
[testsharp] => 0
[testsharpStrict] => 10
)
true for ==
false ===