/**
* 树递归,传引用到底
* @param $id 要递归的id节点
* @param array $arr 返回的多维数组
*/
public static function getMenuTree($id, &$arr = array())
{
$sql = 'select bm_ModuleID as id,bm_ModuleName as text,bm_ModuleUrl as url from BM_ModuleStructure where bm_FModuleID = %d';
$ret = self::getBySql($sql, array($id));
if ($ret) {
$arr['children'] = $ret;
foreach ($arr['children'] as $key=>$v) {
self::getMenuTree($v['id'],$arr['children'][$key]);
}
}
}
/**
*递归返回值需要注意的问题
*/
function findFile($directory, $fileName)
{
$mydir = dir($directory);
while ($file = $mydir->read()) {
if ((is_dir("$directory/$file")) AND ($file != ".") AND ($file != "..")) {
return findFile("$directory/$file", $fileName); //重点
} else if ($file == $fileName) {
$mydir->close();
return "$directory/$file"; //如果是出现的递归,此处返回的是递归里面的函数的值,外面还要返回一层。
}
}
$mydir->close();
return null;
}
/**
*引用的问题,第一次foreach,将$a 指向 arr[2],$a = &$arr[2];
*第二次foreach $a一次赋值,arr[2]也响应改变,121,然后$a被unset,第二第三次的$a都是new的,而且不是引用变量。arr[2]也就没有再被改变。
*/
$arr = array('a'=>1, 'b'=>2, 'c'=>3);
foreach ($arr as &$a); // do nothing. maybe?
foreach ($arr as $a) // do nothing. maybe?
{
unset($a);
}
print_r($arr); //122
/**
*上面的是变量引用
*下面再来看一个函数引用
*/
function &test() //需要调用例如:$a = &test();这引用函数时,该被引用的函数固定格式为:1,必须有返回值,2,函数前面需要加&号。
{
static $b = 0;
echo $b;
return $b;
}
//调用
$a = test(); 没有起到引用的作用。函数定义那里的&是规定格式而已。
$a = &test();
$a = 5;
test();
输出: 0,5;
沉底法
for ($i = 0; $i < count($arr); $i++) {
for ($j = 0; $j < count($arr) - $i -1; $j++) {
if($arr[$j] < $arr[$j+1]){
$tmp = $arr[$j];
$arr[$j] = $arr[$j+1];
$arr[$j+1] = $tmp;
}
}
}
先抛开外循环,内循环就是循环一遍,将最小的元素沉到底。
循环count($arr)次后,达到目的。
count($arr)-$i-1意思就是沉下去的元素都是确定排序的了
反过来冒泡法
for ($i = 0; $i < count($arr); $i++) {
for ($j = count($arr)-1; $j > $i; $j--) {
if($arr[$j] < $arr[$j-1]){
$tmp = $arr[$j];
$arr[$j] = $arr[$j-1];
$arr[$j-1] = $tmp;
}
}
}