標籤:引用 function span return 遞迴 test 調用 adl 變數
遞迴函式是一種調用自己的函數。寫遞迴函式時要小心,因為可能會無窮遞迴下去。必須確保有充分的方法來終止遞迴。
一:使用參數引用完成遞迴函式。操作的是同一塊記憶體位址。
<?php
$i=1;
function test(&$i)
{
echo $i;
$i++;
if ($i <10)
{
test($i);
}
}
test($i);//輸出123456789
test($i);//輸出10
?>
二:使用全域變數完成遞迴函式。在函數域內部用 global 語句匯入的一個真正的全域變數實際上是建立了一個到全域變數的引用。例子中,test()函數內部的 $i 實際上只是程式第一行中($i = 1;)的變數 $i 的一個應用;
<?php
$i = 1;
function test()
{
global$i;
echo $i;
$i++;
if ($i <10)
{
test();
}
}
test();//輸出123456789
test();//輸出10
?>
三:使用靜態變數完成遞迴函式。static的作用:僅在第一次調用函數的時候對變數進行初始化,並且保留變數值。
<?php
function test()
{
static $i = 1;
echo $i;
$i++;
if ($i < 10) {
test();
}
$i--;//在每一層遞迴結束時自減,這一句可以協助理解遞迴函式的執行過程
}
test();//輸出123456789
test();//輸出123456789
?>
例1. 使用全域變數的情況遞迴遍曆檔案夾下的所有檔案
function getFiles($dir)
{
global $arr;
if(is_dir($dir)){
$hadle =@opendir($dir);
while($file=readdir($hadle) )
{
if(!in_array($file,array(‘.‘, ‘..‘)) )
{
$dirr= $dir.‘/‘.$file;
if(is_dir($dirr))
{
getFiles($dirr);
}else{
array_push($arr, $dirr);
}
}
}
}
}
$arr = array();
getFiles(‘E:/logs‘);
print_r($arr);
例2:使用靜態變數的情況遞迴遍曆檔案夾下的所有檔案
function getFiles ($dir)
{
static $arr = array();
if(is_dir($dir)){
$hadle = opendir($dir);
while($file=readdir($hadle))
{
if(!in_array($file,array(‘.‘,‘..‘)))
{
$dirr =$dir."/".$file;
if(is_dir($dirr))
{
getFiles ($dirr);
}else{
array_push($arr,$dirr);
}
}
}
}
return $arr;
}
$rows= array();
$rows = getFiles (‘E:/logs‘);
print_r($rows);
PHP中遞迴的實現(附例子)