Home  >  Article  >  Backend Development  >  函数参数为数组时传值、传址的区别,请高手结合实例讲解

函数参数为数组时传值、传址的区别,请高手结合实例讲解

WBOY
WBOYOriginal
2016-06-20 12:37:231181browse

$json = '[{"id":27,"children":[{"id":30,"children":[{"id":31}]}]},{"id":28,"children":[{"id":29}]},{"id":32}]';
$arry = json_decode($json,true);
print_r($arry);
echo"";
print_r(foo($arry));
echo"";
function foo($ar, $level=0, $parent=0,&$res=array()) {
                      foreach($ar as $v) {
                                                        $t = array();
                                                        $v['level'] = $level;
                                                        $v['parent'] = $parent;
                                                        if(isset($v['children'])) {
                                                                                              $t = $v['children'];
                                                                                              unset($v['children']);
                                                                                            }
                                                        $res[] = $v;
                                                        if($t) foo($t, $level+1, $v['id'], $res);
                                                     }
                       return $res;
   }
?>
Array ( [0] => Array ( [id] => 27 [children] => Array ( [0] => Array ( [id] => 30 [children] => Array ( [0] => Array ( [id] => 31 ) ) ) ) ) [1] => Array ( [id] => 28 [children] => Array ( [0] => Array ( [id] => 29 ) ) ) [2] => Array ( [id] => 32 ) ) 

Array ( [0] => Array ( [id] => 27 [level] => 0 [parent] => 0 ) [1] => Array ( [id] => 30 [level] => 1 [parent] => 27 ) [2] => Array ( [id] => 31 [level] => 2 [parent] => 30 ) [3] => Array ( [id] => 28 [level] => 0 [parent] => 0 ) [4] => Array ( [id] => 29 [level] => 1 [parent] => 28 ) [5] => Array ( [id] => 32 [level] => 0 [parent] => 0 ) ) 

如果是这样
function foo($ar, $level=0, $parent=0, $res=array()) {
                      foreach($ar as $v) {
                                                        $t = array();
                                                        $v['level'] = $level;
                                                        $v['parent'] = $parent;
                                                        if(isset($v['children'])) {
                                                                                              $t = $v['children'];
                                                                                              unset($v['children']);
                                                                                            }
                                                        $res[] = $v;
                                                        if($t) foo($t, $level+1, $v['id'], $res);
                                                     }
                       return $res;
   }
结果 则为:
Array ( [0] => Array ( [id] => 27 [level] => 0 [parent] => 0 ) [1] => Array ( [id] => 28 [level] => 0 [parent] => 0 ) [2] => Array ( [id] => 32 [level] => 0 [parent] => 0 ) ) 
请高手结合此实例,讲解下 传值、传址的区别,谢谢。


回复讨论(解决方案)

值传递:
    拷贝一份原始数据进行操作,不改变原值。
引用传递:
    操作原始数据,操作过后原始数据会改变。

数组值传递实例代码:<?phpfunction main() {        $cc = array(            'a','b'        );        change($cc);        var_dump($cc);        die;}function change($cc){        $cc = array('dd');}main();?>output:array(2) {  [0]=>  string(1) "a"  [1]=>  string(1) "b"}数组引用传递<?phpfunction main() {        $cc = array(            'a','b'        );        change($cc);        var_dump($cc);        die;}function change(&$cc){        $cc = array('dd');}main();?>outpout:array(1) {  [0]=>  string(2) "dd"}


参考这个看看吧:http://www.cnblogs.com/zcy_soft/archive/2011/12/10/2283570.html

  $res[] = $v;
   if($t) foo($t, $level+1, $v['id'], $res)
----这两个语句在函数 foo 内部,但原理是一样的。如同楼上所举的例子

传值不会影响原数组,传地址会。
例子:
地址引用

<?php$arr = array(1,2,3,4,5);pop($arr);print_r($arr);function pop(&$arr){    array_pop($arr);}?>


输出:
Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 )

传值
<?php$arr = array(1,2,3,4,5);$arr1 = pop($arr);print_r($arr);print_r($arr1);function pop($arr){    array_pop($arr);    return $arr;}?>


输出:
Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 [4] => 5 ) 
Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 )

说白了就是,函数的参数,默认都是复制一份的,这样你函数内怎么折腾都不会影响到使用函数时传过来的变量
加上&就不会复制,而直接用了

传值就是多复制一份,相互不影响
引用就是同时操作同一份数据,相互影响

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn