yanqiufang 发表于 2017-4-9 10:45:34

php的数组传值调用与传址调用

  在java中数组的调用默认是是传址调用:主体方法中传递一个数组给某个方法,在该方法内修改了数组的某个值;回到主方法中会发现数组已经发生了改变;
  测试代码:

public class ArrayTest {
public static void main(String[] args){
Map[] maparray=new Map;
for (int i = 0; i < maparray.length; i++) {
Map<String,String> map=new HashMap<String,String>();
map.put("a", i+"_ajkcz");
map.put("c", "werq_"+i);
maparray=map;
}
System.out.println("++++++++++++++++++++++++");
for (int i = 0; i < maparray.length; i++) {
Map<String,String> map=maparray;
Iterator it=map.keySet().iterator();
while(it.hasNext()){
String key=(String) it.next();
System.out.println(key+"\t"+map.get(key) );
}
}
System.out.println("++++++++++++++++++++++++");
new ArrayCharge().printAndChangeArray(maparray);

System.out.println("++++++++++++++++++++++++");
for (int i = 0; i < maparray.length; i++) {
Map<String,String> map=maparray;
Iterator it=map.keySet().iterator();
while(it.hasNext()){
String key=(String) it.next();
System.out.println(key+"\t"+map.get(key) );
}
}

}

}

class ArrayCharge {
public void printAndChangeArray(Map[] maparray){
for (int i = 0; i < maparray.length; i++) {
Map<String,String> map=maparray;
map.put("a",i+"________");
}
for (int i = 0; i < maparray.length; i++) {
Map<String,String> map=maparray;
Iterator it=map.keySet().iterator();
while(it.hasNext()){
String key=(String) it.next();
System.out.println(key+"\t"+map.get(key) );
}
}
}

}
控制台输出结果:
++++++++++++++++++++++++
cwerq_0
a0_ajkcz
cwerq_1
a1_ajkcz
cwerq_2
a2_ajkcz
++++++++++++++++++++++++
cwerq_0
a0________
cwerq_1
a1________
cwerq_2
a2________
++++++++++++++++++++++++
cwerq_0
a0________
cwerq_1
a1________
cwerq_2
a2________

  而在php中,数组的调用默认是传值调用,在字方法中修改了数组,在父方法中无法察觉
  测试代码:

<?php
$arraytest=array();
for($i=0;$i<3;$i++){
$child=array();
$child['keystr']='key'.$i;
$child['valuestr']='value'.$i;
$arraytest[]=$child;
}
print_r($arraytest);
print_r("+++++++++++++++++++++++++");
for($i=0;$i<count($arraytest);$i++){
$child=$arraytest[$i];
$child['valuestr']="_________".$i;
}

print_r($arraytest);
print_r("+++++++++++++++++++++++++");
?>
控制台输出:
Array (
=> Array (
=> key0
=> value0
)
=> Array (
=> key1
=> value1
)
=> Array (
=> key2
=> value2
)
)
+++++++++++++++++++++++++
Array (
=> Array (
=> key0
=> value0
)
=> Array (
=> key1
=> value1
)
=> Array (
=> key2
=> value2
)
) +++++++++++++++++++++++++
  如果希望在php中也能类似java中传数组参数给字方法,字方法处理完成后父方法中数组也跟随改变则需要在传递参数时不传递值而是传递值的指针,例如p的值是100,即$p=100;在传递p给字方法时需要传递的参数则为“&$p”
  测试代码:

<?php
$arraytest=array();
for($i=0;$i<3;$i++){
$child=array();
$child['keystr']='key'.$i;
$child['valuestr']='value'.$i;
$arraytest[]=$child;
}
print_r($arraytest);
print_r("+++++++++++++++++++++++++");
for($i=0;$i<count($arraytest);$i++){
$child=&$arraytest[$i]; //注意这里加了一个指针符号,代表是传址调用
$child['valuestr']="_________".$i;
}

print_r($arraytest);
print_r("+++++++++++++++++++++++++");
?>
控制台输出:
Array (
=> Array (
=> key0
=> value0
)
=> Array (
=> key1
=> value1
)
=> Array (
=> key2
=> value2
)
)
+++++++++++++++++++++++++
Array (
=> Array (
=> key0
=> _________0
)
=> Array (
=> key1
=> _________1
)
=> Array (
=> key2
=> _________2
)
)
+++++++++++++++++++++++++
页: [1]
查看完整版本: php的数组传值调用与传址调用