意外的PHP数组键行为

时间:2017-04-18 04:04:26

标签: php arrays strpos

好的,我发现这很奇怪,但应该有一个解释。这是发生的事情。

这里的代码应该没有回应:

$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;
    }
}

所以即使在变量$key前面使用(字符串),它也会在登录表单中禁止无辜者

1 个答案:

答案 0 :(得分:1)

使用它,它会正常工作。我将$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);
}