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
相关产品推荐
相关产品推荐

