意外的 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);
}
好吧,我觉得这很奇怪,但应该有一个解释。事情是这样的。
这里的这段代码应该什么都不回显:
$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);
}