一些语法,算法。
/** * 树递归,传引用到底 * @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; } } }
暗夜之中,才见繁星;危机之下,暗藏转机;事在人为,为者常成。