函数参数为数组时传值、传址的区别,请高手结合实例讲解
$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 )
说白了就是,函数的参数,默认都是复制一份的,这样你函数内怎么折腾都不会影响到使用函数时传过来的变量
加上&就不会复制,而直接用了
传值就是多复制一份,相互不影响
引用就是同时操作同一份数据,相互影响

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas



Pembalakan PHP adalah penting untuk memantau dan menyahpepijat aplikasi web, serta menangkap peristiwa kritikal, kesilapan, dan tingkah laku runtime. Ia memberikan pandangan yang berharga dalam prestasi sistem, membantu mengenal pasti isu -isu, dan menyokong penyelesaian masalah yang lebih cepat

Laravel memudahkan mengendalikan data sesi sementara menggunakan kaedah flash intuitifnya. Ini sesuai untuk memaparkan mesej ringkas, makluman, atau pemberitahuan dalam permohonan anda. Data hanya berterusan untuk permintaan seterusnya secara lalai: $ permintaan-

Pelanjutan URL Pelanggan PHP (CURL) adalah alat yang berkuasa untuk pemaju, membolehkan interaksi lancar dengan pelayan jauh dan API rehat. Dengan memanfaatkan libcurl, perpustakaan pemindahan fail multi-protokol yang dihormati, php curl memudahkan execu yang cekap

Laravel menyediakan sintaks simulasi respons HTTP ringkas, memudahkan ujian interaksi HTTP. Pendekatan ini dengan ketara mengurangkan redundansi kod semasa membuat simulasi ujian anda lebih intuitif. Pelaksanaan asas menyediakan pelbagai jenis pintasan jenis tindak balas: Gunakan Illuminate \ Support \ Facades \ http; Http :: palsu ([ 'Google.com' => 'Hello World', 'github.com' => ['foo' => 'bar'], 'forge.laravel.com' =>

Adakah anda ingin memberikan penyelesaian segera, segera kepada masalah yang paling mendesak pelanggan anda? Sembang langsung membolehkan anda mempunyai perbualan masa nyata dengan pelanggan dan menyelesaikan masalah mereka dengan serta-merta. Ia membolehkan anda memberikan perkhidmatan yang lebih pantas kepada adat anda

Alipay Php ...

Artikel membincangkan pengikatan statik lewat (LSB) dalam PHP, yang diperkenalkan dalam Php 5.3, yang membolehkan resolusi runtime kaedah statik memerlukan lebih banyak warisan yang fleksibel. Isu: LSB vs polimorfisme tradisional; Aplikasi Praktikal LSB dan Potensi Perfo

Artikel ini membincangkan menambah fungsi khusus kepada kerangka kerja, memberi tumpuan kepada pemahaman seni bina, mengenal pasti titik lanjutan, dan amalan terbaik untuk integrasi dan debugging.
