为什么多维数组会替换第一个键值的第一个字母?

时间:2011-03-04 18:50:37

标签: php multidimensional-array

我有一个意外行为的多维数组,我想知道为什么会这样,如果有解决方法的话。似乎如果我在数组的第一个键中设置了某个东西,当我在它的第二个键中声明一个值时,它将替换它的第一个字母。 (我不确定如何正确描述行为,但这段代码应该有所帮助:

<?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!

5 个答案:

答案 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]
0jerk字符串转换为整数。

$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.如果你的字符串可以强制转换为另一个整数,那么它将返回(或设置)一个不同的字符字符串。