我有一个意外行为的多维数组,我想知道为什么会这样,如果有解决方法的话。似乎如果我在数组的第一个键中设置了某个东西,当我在它的第二个键中声明一个值时,它将替换它的第一个字母。 (我不确定如何正确描述行为,但这段代码应该有所帮助:
<?php
//Declare Array with first key and value
$test['hello'] = "Hello There";
//Echo Value
echo "HELLO TEST: ". $test['hello'] ;
//Declare Multidimensional Array using the first array key and a new key
$test['hello']['jerk'] = "JERK!";
//Echo Values
echo "<br/>HELLO TEST: ". $test['hello'] ;
echo "<br/>JERK TEST : ". $test['hello']['jerk'];
?>
该代码输出如下:
你好测试:你好 你好测试:Jello有 JERK TEST:J
我希望看到
你好测试:你好 你好测试:你好 JERK TEST:JERK!
答案 0 :(得分:4)
这样做:
$test['hello'] = "Hello There";
您声明$test['hello']
包含字符串。
然后,这样做:
$test['hello']['jerk'] = "JERK!";
您声明$test['hello']
包含数组;而不再是一个字符串。
您的$test['hello']
只能包含一件事。
实际上,当你这样做时:
$test['hello']['jerk'] = "JERK!";
由于$test['hello']
包含字符串(而不是数组),我认为PHP会尝试访问此条目:$test['hello'][0]
0
将jerk
字符串转换为整数。
$test['hello'][0]
表示 $test['hello']
中字符串的第一个字符
请参阅手册中的String access and modification by character。
现在,您正在尝试将整个字符串("JERK!"
)放在只有一个字符的位置 - 现有字符串的第一个字符。而那个被字符串"JERK!"
的第一个字符覆盖。
编辑一段时间后,这里有完整的解释,注释代码:
// Assign a string to $test['hello']
$test['hello'] = "Hello There";
//Echo Value
var_dump($test['hello']);
// Try to assign a string to $test['hello']['jerk']
$test['hello']['jerk'] = "JERK!";
// But $test['hello'] is a string, so PHP tries to make a string-access to one character
// see http://fr.php.net/manual/en/language.types.string.php#language.types.string.substr
// As 'jerk' is a string, it gets converted to an integer ; which is 0
// So, you're really trying to do this, here :
$test['hello'][0] = "JERK!";
// And, as you can only put ONE character where ($test['hello'][0]) there is space for only one ,
// only the first character of "JERK!" is kept.
// Which means that what's actually done is :
$test['hello'][0] = "J";
// Still echo the whole string, with the first character that's been overriden
var_dump($test['hello']);
// Same as before : here, you're only accessing $test['hello'][0]
// (which is the first character of the string -- the one that's been overriden)
var_dump($test['hello']['jerk']);
// Same as this :
var_dump($test['hello'][0]);
答案 1 :(得分:3)
因为它不是数组。这是一个字符串。
$test['hello'] = array();
$test['hello']['jerk'] = "JERK!"
您正在尝试将$test['hello']
中存储的字符串视为数组。你不能让$test['hello']
同时拥有一个字符串(“Hello There”)和另一个数组。
答案 2 :(得分:3)
来自http://ca2.php.net/language.types.string。
字符串中的字符可能是 通过指定访问和修改 所需的零基偏移量 使用字符串后的字符 方阵列括号,如 $ str [42] ...非整数[索引]是 转换为整数...只有第一个 指定字符串的字符是 使用
所以,回答你的问题。 $test['hello']
是一个字符串,因此将应用索引字符串的规则。因此,$test['hello']['jerk'] = "JERK!";
相当于$test['hello'][0] = "J";
,因为'jerk'
的intval是0
,并且只有指定字符串"J"
的第一个字符"JERK!"
才会使用。
之后,当回显$test['hello']
时,您将引用整个字符串,现在其第一个字符被J
替换。回应$test['hello']['jerk']
再次等同于回显$test['hello'][0]
,因为'jerk'
的intval是0
,并且通过索引字符串的规则,$test['hello'][0]
将返回第一个字符$test['hello']
。
在解释你打算做什么时,也许你想要这个。
$test['hello'] = "Hello There";
$test['jerk'] = "JERK!";
print_r($test); // array('hello' => "Hello There", 'jerk' => "JERK!")
或者,要有多维的东西......
$test['message']['hello'] = "Hello There";
$test['message']['jerk'] = "JERK!";
print_r($test);
// array('message' => array('hello' => "Hello There", 'jerk' => "JERK!"))
答案 3 :(得分:1)
您试图将$test['hello']
声明为两件事:字符串和数组。它只能是一个或另一个。
答案 4 :(得分:1)
值得指出的是代码示例中发生的事情。
可以像基于索引的数组一样访问字符串。当你试图设置“数组”的第二级时它实际做的是这个(因为第一级是一个字符串):
$array['levelOne'] = 'Hello.';
$array['levelOne'][(int)'jerk'];
基本上这会给(或设置)字符串的第一个字符,因为'jerk'强制转换为整数是0.如果你的字符串可以强制转换为另一个整数,那么它将返回(或设置)一个不同的字符字符串。