为什么PHP会丢失数组项的值?

6

我有一个包含值的数组:

$array1 = array('Boss', 'Lentin', 'Endless'); 
print_r ($array); 

结果将是:
Array ( [0] => Boss [1] => Lentin [2] => Endless

没问题。

但是,如果我向这个数组添加两个带有键的元素,"Boss" 元素将会丢失。

$array2 = array("1"=>'Doctor','Boss', 2=>'Lynx', 'Lentin', 'Endless');
print_r ($array2);

结果将是:
Array ( [1] => Doctor [2] => Lynx [3] => Lentin [4] => Endless ) 
//Where is "BOSS"???

为什么?

语法很重要,当事情出了问题时查看错误日志也同样重要! - RiggsFolly
没有任何错误和语法问题。 - Weltkind
你需要创建一个二维数组来存储多个值。 - Arsalan Mithani
6个回答

8
当php创建数组时,在索引1中设置Doctor,在索引2中设置Boss,但是2=>'Lynx'会导致php覆盖索引2并将Lynx设置为其中的值。
您可以在设置索引后进行设置,或者使用索引进行设置。例如:
$array2 = array("1"=>'Doctor', 2=>'Lynx', 'Boss', 'Lentin', 'Endless');
// or 
$array2 = array("1"=>'Doctor', 2=>'Boss', 3=>'Lynx', 'Lentin', 'Endless');

5

在创建 $array 数组时,'Boss' 会首先被存储在索引 2 中 (Array([2] =>'Boss'),稍后被 'Lynx' 覆盖。


3
这是php的预期行为(请参阅http://php.net/manual/en/language.types.array.php#example-57)。如果您需要数组中的所有值并且不需要使用键,则建议使用array_push($array $value)。否则,您应该添加所有带有其键的值,并记住对于PHP,1"1"true是相同的值,因此它们将互相覆盖。

你指的是哪个手册?我在发布的链接中写道:“由于上面示例中的所有键都被转换为1,因此该值将在每个新元素上被覆盖,并且最后分配的值“d”是唯一剩下的值。” ==> 在你的例子中,你首先设置了 "1"=>'Doctor',所以键被强制为 1。接下来一个没有键,所以只有前一个的值增加到 2。你继续设置 2=>'Lynx',但是键 2 已经用于 Boss,这就是为什么它被新值 Lynx 替换的原因。最后,Boss 完全从数组中消失了。 - Tomáš Tatarko

3
您的问题是索引键。
$array2 = array("1"=>'Doctor','Boss', 2=>'Lynx', 'Lentin', 'Endless');
print_r ($array2);

这是因为在索引1上已经是医生,老板将成为第二个,而且将被同样索引为2的Lynx所取代,老板将被替换掉。
我希望我说得清楚。

2

array() 是一个具有动态参数的构造函数,表示字面意义的数组。给定值分配到数组结构中的过程是顺序执行的,即从左到右逐个进行。在你的例子中:

  1. Doctor 分配给索引 1。
  2. Boss 分配给索引 2。
  3. Lynx 覆盖了索引 2。
  4. LentinEndless 分别分配给索引 3 和 4。

1
嘿@Weltkind,首先我建议你阅读“http://php.net/manual/en/language.types.array.php”,现在来回答你的问题,在PHP中,数组键可以是字符串或整数,如果你不指定键,则默认设置为整数,并且下一个数组键的值取决于前一个数组整数键,即下一个数组键=前一个整数键+1;在PHP数组中,相同的键值将被相同的键覆盖。现在让我们用你的array2来理解一下:
<?php
$array2 = array("1"=>'Doctor','Boss', 2=>'Lynx', 'Lentin', 'Endless');

1)由于您使用“1”键启动了数组,因此第一个键的值为[1] =>'Doctor',当前数组如下:array([1] =>'Doctor')。
现在下一个键是上一个整数键(即1)+1=2;
2)对于第二个键,其值为[2] =>'BOSS',当前数组如下:array([1] =>'Doctor', [2] =>'BOSS')。
3)下一个键是上一个整数键(即2)+1=3,它将移动到下一个键,但由于您提到下一个键是[2] =>'Lynx',因此在键[2]处,该值将被值'BOSS'覆盖为'Lynx'。当前数组如下:array([1] =>'Doctor', [2] =>'Lynx')。
现在我们有了下一个键[3]。
4) 下一个键是[3] => 'Lentin' 当前数组为:array([1] => 'Doctor', [2] => 'Lynx', [3] => 'Lentin'); 现在下一个键 = 前一个整数键(即3) + 1 = 4; 5) 下一个键是[4] => 'Endless' 当前数组为:array([1] => 'Doctor', [2] => 'Lynx', [3] => 'Lentin', [4] => 'Endless');
这就是为什么最终的数组如下所示:
array(
        [1] => 'Doctor', 
        [2] => 'Lynx', 
        [3] => 'Lentin', 
        [4] => 'Endless'
    );

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接