意外的 PHP 数组键行为

Unexpected PHP Array key behaviour

好吧,我觉得这很奇怪,但应该有一个解释。事情是这样的。

这里的这段代码应该什么都不回显:

$str = 'a@gmail.com';
$key = '11111';
echo strpos($str, $key);
exit;

.. 是的,这正是我得到的,什么都没有。但 !! 如果我要使用 $key(包含字符串)作为数组的实际键:

$str = 'a@gmail.com';
$arr = array('11111' => 'test');
foreach ($arr as $key => $val)
{
    echo 'String: '.$str.'<br>';
    echo 'Key: '.$key.'<br>';
    echo 'Found at position: '.strpos($str, $key);
}
exit;

我得到了这个惊人的、神奇的结果:

String: a@gmail.com
Key: 11111
Found at position: 2

那么 php 在这里找到的字符串 11111 就是字母 g 但更神奇的是,位数改变了结果:

$str = 'a@gmail.com';
$arr = array('111' => 'test');
foreach ($arr as $key => $val)
{
    echo 'String: '.$str.'<br>';
    echo 'Key: '.$key.'<br>';
    echo 'Found at position: '.strpos($str, $key);
}
exit;

这个给出:

String: a@gmail.com
Key: 111
Found at position: 9

有这方面的专家吗? 谢谢。

编辑: 这是我的项目中使用的实际代码示例,它给出了这样的误报:

$email = '[the email of the user here]';
$arr = array(
    // [...]
    '11111' => 'Banned',
    '22222' => 'Banned',
    '33333' => 'Banned',
    // [...]
);
foreach ($arr as $key => $reason)
{
    if (strpos($email, (string)$key) !== false)
    {
        return 'Keyword: '.(string)$key.' found in the user Email address with reason: '.(string)$reason;
    }
}

所以即使在变量前面使用 (string) $key 它也禁止无辜者在登录表单

用这个,它会很好用。我将 casted $key 键入 string。 PHP 函数 strpos 用于匹配字符串中的子字符串,而不是整数值。如果您查看文档,会清楚地提到

第二个参数:If needle is not a string, it is converted to an integer and applied as the ordinal value of a character.

<?php
ini_set('display_errors', 1);
$str = 'a@gmail.com';
$arr = array('11111' => 'test');
foreach ($arr as $key => $val)
{
    echo 'String: '.$str.'<br>';
    echo 'Key: '.$key.'<br>';
    echo 'Found at position: '.strpos($str, (string)$key);
}