You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP类中嵌套数组无法追加元素的原因及解决方法

问题分析与修复:PHP二维数组追加元素无效的问题

没错,你怀疑的按值传递/按引用传递就是问题的核心!

为什么会出现这个问题?

先看你App()方法里的这段代码:

$V = $this->cms['V']; // 注意:你代码里写的$cms[0]['V']是错误的,你的$cms是关联数组,键是'V'不是索引0
array_push($V, $elm);

在PHP中,数组默认是按值传递的。也就是说,当你把$this->cms['V']赋值给$V时,$V只是原数组的一个副本,而不是指向原数组的引用。你后续用array_push修改的只是这个临时副本,对象里原本的$this->cms['V']根本没被改动,所以每次打印外层数组时,内层的V始终是空的。

另外还要纠正你代码里的一个小笔误:你的$cms是关联数组,键是'S'和'V',所以访问内层数组应该用$this->cms['V'],而不是$this->cms[0]['V']——不过从你的输出结果来看,实际运行时应该是用对了,否则会报错或者输出异常。

怎么修复?

有几种简单的修复方式,任选其一即可:

方式1:直接操作原数组(最推荐)

跳过临时变量,直接对对象里的原数组进行追加操作,这是最直观也最不容易出错的写法:

public function App($elm) {
    // 用array_push或者直接用[]追加都可以
    array_push($this->cms['V'], $elm);
    // 或者更简洁的:$this->cms['V'][] = $elm;
    $this->Prt();
}

方式2:使用引用赋值临时变量

如果你一定要用临时变量来操作,可以给变量加上&符号,让它成为原数组的引用——这样修改临时变量时,就会直接作用于原数组:

public function App($elm) {
    $V = &$this->cms['V']; // 加&表示引用赋值
    array_push($V, $elm);
    $this->Prt();
}

修复后,你再运行代码:

$aa = new ArrApp();
$aa->Prt();
$aa->App(1);
$aa->Prt();

输出就会变成:

Array ( [S] => A [V] => Array ( ) )
Array ( [S] => A [V] => Array ( [0] => 1 ) )
Array ( [S] => A [V] => Array ( [0] => 1 ) )

内层数组就会正确追加元素啦!

内容的提问来源于stack exchange,提问作者SSteven

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 08:54:08