<span><span><span class="hljs-variable">$result</span></span><span> = </span><span><span class="hljs-title function_ invoke__">array_fill</span></span><span>(</span><span><span class="hljs-number">0</span></span><span>, </span><span><span class="hljs-number">3</span></span><span>, </span><span><span class="hljs-string">'A'</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">print_r</span></span><span>(</span><span><span class="hljs-variable">$result</span></span><span>);
</span></span>
输出结果:
<span><span><span class="hljs-title function_ invoke__">Array</span></span><span>
(
[</span><span><span class="hljs-number">0</span></span><span>] => A
[</span><span><span class="hljs-number">1</span></span><span>] => A
[</span><span><span class="hljs-number">2</span></span><span>] => A
)
</span></span>
这与预期一致,从索引 0 开始填充 3 个元素。
当 $start_index 为负数时,PHP 并不会抛出错误,而是直接以该负数作为键名填充数组。
示例:
<span><span><span class="hljs-variable">$result</span></span><span> = </span><span><span class="hljs-title function_ invoke__">array_fill</span></span><span>(-</span><span><span class="hljs-number">3</span></span><span>, </span><span><span class="hljs-number">3</span></span><span>, </span><span><span class="hljs-string">'B'</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">print_r</span></span><span>(</span><span><span class="hljs-variable">$result</span></span><span>);
</span></span>
输出结果:
<span><span><span class="hljs-title function_ invoke__">Array</span></span><span>
(
[-</span><span><span class="hljs-number">3</span></span><span>] => B
[-</span><span><span class="hljs-number">2</span></span><span>] => B
[-</span><span><span class="hljs-number">1</span></span><span>] => B
)
</span></span>
可以看到,数组从 -3 开始,依次填充到 -1。
这说明 负数索引在 PHP 中是允许的,并且能按照正常的整数键规则向上递增。
我们再看一个混合场景:
<span><span><span class="hljs-variable">$result1</span></span><span> = </span><span><span class="hljs-title function_ invoke__">array_fill</span></span><span>(-</span><span><span class="hljs-number">2</span></span><span>, </span><span><span class="hljs-number">2</span></span><span>, </span><span><span class="hljs-string">'X'</span></span><span>);
</span><span><span class="hljs-variable">$result2</span></span><span> = </span><span><span class="hljs-title function_ invoke__">array_fill</span></span><span>(</span><span><span class="hljs-number">3</span></span><span>, </span><span><span class="hljs-number">2</span></span><span>, </span><span><span class="hljs-string">'Y'</span></span><span>);
</span><span><span class="hljs-variable">$merged</span></span><span> = </span><span><span class="hljs-variable">$result1</span></span><span> + </span><span><span class="hljs-variable">$result2</span></span><span>; </span><span><span class="hljs-comment">// 使用数组相加</span></span><span>
</span><span><span class="hljs-title function_ invoke__">print_r</span></span><span>(</span><span><span class="hljs-variable">$merged</span></span><span>);
</span></span>
输出结果:
<span><span><span class="hljs-title function_ invoke__">Array</span></span><span>
(
[-</span><span><span class="hljs-number">2</span></span><span>] => X
[-</span><span><span class="hljs-number">1</span></span><span>] => X
[</span><span><span class="hljs-number">3</span></span><span>] => Y
[</span><span><span class="hljs-number">4</span></span><span>] => Y
)
</span></span>
这说明即使负数和正数索引同时存在,它们依然保持各自独立的键名空间,不会发生冲突。
数组键允许负数
在 PHP 中,数组键既可以是正数,也可以是负数,只要是整数即可。
与 array_merge 的区别
使用 array_merge 时,数值键会被重新索引,而负数键也会被重新整理为从 0 开始的正整数。
示例:
<span><span><span class="hljs-variable">$a</span></span><span> = </span><span><span class="hljs-title function_ invoke__">array_fill</span></span><span>(-</span><span><span class="hljs-number">2</span></span><span>, </span><span><span class="hljs-number">3</span></span><span>, </span><span><span class="hljs-string">'Z'</span></span><span>);
</span><span><span class="hljs-variable">$b</span></span><span> = </span><span><span class="hljs-title function_ invoke__">array_fill</span></span><span>(</span><span><span class="hljs-number">5</span></span><span>, </span><span><span class="hljs-number">2</span></span><span>, </span><span><span class="hljs-string">'W'</span></span><span>);
</span><span><span class="hljs-variable">$merged</span></span><span> = </span><span><span class="hljs-title function_ invoke__">array_merge</span></span><span>(</span><span><span class="hljs-variable">$a</span></span><span>, </span><span><span class="hljs-variable">$b</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">print_r</span></span><span>(</span><span><span class="hljs-variable">$merged</span></span><span>);
</span></span>
输出结果:
<span><span><span class="hljs-title function_ invoke__">Array</span></span><span>
(
[</span><span><span class="hljs-number">0</span></span><span>] => Z
[</span><span><span class="hljs-number">1</span></span><span>] => Z
[</span><span><span class="hljs-number">2</span></span><span>] => Z
[</span><span><span class="hljs-number">3</span></span><span>] => W
[</span><span><span class="hljs-number">4</span></span><span>] => W
)
</span></span>
可见,负数索引在合并过程中会丢失原有的键值,转而重新编号。