<?php
/* PHP devs, test & tell me I'm crazy. */
$x[] = '1';
if (empty($x[0]['x'])) {
echo 'No PHP bug.';
}
else {
echo 'PHP bug exists.';
}
?>
我总是得到“存在PHP错误”。
<?php
/* PHP devs, test & tell me I'm crazy. */
$x[] = 1;
if (empty($x[0]['x'])) {
echo 'No PHP bug.';
}
else {
echo 'PHP bug exists.';
}
?>
输出“没有PHP错误。”
<?php
/* PHP devs, test & tell me I'm crazy. */
$x[] = '1';
if (!isset($x[0]['x'])) {
echo 'No PHP bug.';
}
else {
echo 'PHP bug exists.';
}
?>
输出“存在PHP错误。”
<?php
/* PHP devs, test & tell me I'm crazy. */
$x[] = '1';
if (!isset($x[0]['hello world'])) {
echo 'No PHP bug.';
}
else {
echo 'PHP bug exists.';
}
?>
输出“存在PHP错误。”
答案 0 :(得分:8)
这是因为您要为数组分配字符串。因此,x
中的$x[0]['x']
会自动转换为0
- 请记住,第二个indes不是指向一个数组,而是指向一个不能指向非数组的字符串数字索引。
$x[0][0]
确实存在 - 它是字符串的第一个字符。
$x[0][1]
不存在,如果您相应地更改了索引,测试会返回正确的结果:
if (isset($x[0][0])) echo "0 index is set.";
if (isset($x[0][1])) echo "1 index is not set.";
课程:尽管字符串可以像数组一样访问,但它们不是数组。
有warning in the PHP manual page on strings解释行为:
写入超出范围的偏移量填充带有空格的字符串。非整数类型转换为整数。非法偏移类型会发出E_NOTICE。负偏移在写入时发出E_NOTICE但读取空字符串。仅使用指定字符串的第一个字符。分配空字符串会指定NULL字节。
答案 1 :(得分:2)
这不是错误。
$x[] = '1';
这样就形成了一个数组:array(1)
。
所以$x[0] == '1'
。
当您执行$x[0]['x']
时,您正在执行"1"['x']
。
'x'
转换为0
,"1"[0] == "1"
转换为非空。
答案 2 :(得分:0)
我认为这与你可以按字符访问字符串字符的方式有关。
$x[0]['x']
相当于
$x = '1';
$x['x'];
由于您使用[]
访问字符串,它会将索引转换为整数,在这种情况下,'x'将转换为0,因此它将提取第一个字符'1'
这是一个演示:
$x[] = '1';
var_dump($x[0]['x']);