1 用PHP打印出前一天的時間格式是2006-5-10 22:21:21php
$a = date("Y-m-d H:i:s", strtotime("-1 day")); print_r($a);
2 eecho print var_dump()和print_r()的區別 web
echo是PHP語句, print和print_r是函數,語句沒有返回值,函數能夠有返回值(即使沒有用) print只能打印出簡單類型變量的值(如int,string) print_r能夠打印出複雜類型變量的值(如數組,對象) echo -- 輸出一個或者多個字符串
3 可以使HTML和PHP分離開使用的模板redis
Smarty, Dwoo, tinyButStrong Templete Lite Savant, phemplate XTemplate等模板引擎
4 isset、empty、is_null的區別算法
isset 判斷變量是否認義或者是否爲空
empty:判斷變量的值是否爲空,能轉換爲false的都是空,爲空返回true,反 之返回false
is_null:檢測傳入的值(值、變量、表達式)是否爲null
5 寫出smarty模板的特色數據庫
速度快,編譯型,緩存技術,插件機制,強大的表現邏輯
6 語句include和require的區別是什麼?爲避免屢次包含同一文件,可用(?)語句代替它們?編程
include引入文件的時候,若是碰到錯誤,會給出提示,並繼續運行下邊的代碼。 能夠用include_once代替
require引入文件的時候,若是碰到錯誤,會給出提示,並中止運行下邊的代碼,能夠用require_once代替
7 如何修改SESSION的生存時間?windows
setcookie(),session_set_cookie_params()
8 COOKIE、SESSION的聯繫和區別,多臺web服務器如何共享SESSION?設計模式
1 COOKIE和SESSION都是用於會話機制,COOKIE保存在客戶端,而SESSION則保存在服務器端。
在默認狀況下,SESSION機制是基於COOKIE的,每生成一個SESSIONID,都會將其發送到瀏覽器端,讓後將其保存到COOKIE當中,在下次請求的時候,由瀏覽器攜帶這個COOKIE 2 1、將本該保存在web服務器磁盤上的session數據保存到cookie中 即用cookie會話機制替代session會話機制,將session數據保存到客戶端瀏覽器的cookie中,這樣同一個用戶訪問同一網站時,不管負載均衡到哪臺web服務器,都不用再去服務器請求session數據,而直接獲取客戶端cookie中的session數據。如此,同一個用戶的登陸狀態就不會丟失了。 但這樣作,有三大弊端: 把session數據放到客戶端的cookie中,通常都是重要數據(如用戶id、暱稱等),會存在安全問題,但能夠將session數據加密後,再存放到cookie中,來下降安全風險。 瀏覽器對單個cookie的數據量大小限制爲4K左右,所以會存在數據量的限制問題。 影響帶寬性能,下降了頁面的訪問速度。在高訪問量的狀況下,用戶每次請求時,都要將客戶端cookie中的session數據發送到服務器,要佔用較多的帶寬,進而影響訪問速度,服務器帶寬成本增高。 2、將本該保存在web服務器磁盤上的session數據保存到MySQL數據庫中 sessionid仍是利用cookie機制存儲到客戶端,但session數據卻存放在MySQL服務器上。(須要創建sessionid和session數據行的對應關係) 但這樣作,只適合訪問量比較小的網站。若是網站的訪問量比較大,對MySQL服務器會形成很大壓力。由於每次用戶請求頁面(即便是刷新頁面)都要查詢MySQL數據庫中的session數據表,進而判斷用戶的登陸狀態和讀取用戶相關信息,勢必會對數據庫服務器形成很大壓力,這樣就會下降服務器的響應速度,影響用戶體驗。 3、將本該保存在web服務器磁盤上的session數據保存到內存數據庫(memcache或redis)中 memcache或redis是基於內存存儲數據的,性能很高,尤爲是高併發的狀況下尤其合適。主要是由於從內存中讀取數據要比從磁盤讀取數據快不少。 內存數據庫還支持數據過時失效的機制,正好與session的過時機制對應,推薦使用redis內存數據庫,由於它比memcache支持更多的 數據類型,且支持內存數據備份到磁盤
9 memcache和redis的區別?數組
1、存儲方式: memecache 把數據所有存在內存之中,斷電後會掛掉,數據不能超過內存大小 redis有部份存在硬盤上,這樣能保證數據的持久性。 2、數據支持類型: redis在數據支持上要比memecache多的多。 3、使用底層模型不一樣: 新版本的redis直接本身構建了VM 機制 ,由於通常的系統調用系統函數的話,會浪費必定的時間去移動和請求。 4、運行環境不一樣: redis目前官方只支持LINUX 上去行,從而省去了對於其它系統的支持,這樣的話能夠更好的把精力用於本系統 環境上的優化,雖而後來微軟有一個小組爲其寫了補丁。可是沒有放到主幹上
10 在PHP中,heredoc是一種特殊的字符串,它的結束標誌必須?瀏覽器
$a = <<EOD
good test
EOD;
11 談談對MVC的認識?
MVC是一種流行的程序架構,MVC是 模型(Model) 、視圖(View)、控制器(Control) 的英文首字母的縮寫,核心思想是:視圖和用戶交互 經過事件致使控制器改變 控制器改變致使模型改變 或者控制器同時改變二者 模型改變 致使視圖改變 或者視圖改變 潛在的從模型裏面得到參數 來改變本身。 MVC(Model-View-Controller),即把一個應用的輸入、處理、輸出流程按照Model、View、Controller的方式進行分離,這樣一個應用被分紅三個層——模型層、視圖層、控制層。 視圖(View):表明用戶交互界面,MVC設計模式對於視圖的處理是限於視圖上數據的採集和處理,以及用戶的請求,而不包括在視圖上的業務流程的處理。 模型(Model):業務流程/狀態的處理以及業務規則的制定。業務流程的處理過程對其它層來講是黑箱操做,模型接受視圖請求的數據,並返回最終的處理結果。業務模型的設計能夠說是MVC的核心。 控制(Controller):能夠理解爲從用戶接收請求, 將模型與視圖匹配在一塊兒,共同完成用戶的請求,可是它卻不作任何的數據處理。
12 打開php.ini中的safe_mode,會影響哪些函數?至少說出6個
safe_mode,PHP安全模式,它提供一個基本安全的共享環境,在一個有多個用戶帳戶存在的php開發的web服務器上。當安全模式打開的時候,一些函數將被徹底的禁止,而另外一些函數的功能將會受到限制,如:chdir,move_uploaded_file,chgrp,parse_ini_file,chown,rmdir,copy,rename,fopen,require,mkdir,unlink等。
注意,在php5.3以上版本,safe_mode被棄用,在php5.4以上版本,則將此特性徹底去除了。
13 PHP的垃圾收集機制是怎樣的?
PHP能夠自動進行內存管理,清除再也不須要的對象。
PHP使用了引用計數(reference counting)這種單純的垃圾回收(garbage collection)機制。每一個對象都內含一個引用計數器,每一個reference鏈接到對象,計數器加1。當reference離開生存空間或被設爲NULL,計數器減1。當某個對象的引用計數器爲零時,PHP知道你將再也不須要使用這個對象,釋放其所佔的內存空間。
14 請描述PHP(或其餘語言)Session的運行機制,大型網站中Session方面應注意什麼?
session機制是一種服務器端的機制,它將數據保存到服務器端。 當程序須要爲某個客戶端的請求建立一個session的時候,服務器首先檢查這個客戶端的請求裏是否已包含了一個session標識,稱爲sessionid,若是已包含一個sessionid則說明之前已經爲此客戶端建立過session,服務器就按照sessionid把這個session檢索出來使用(若是檢索不到,可能會新建一個),若是客戶端請求不包含sessionid,則爲此客戶端建立一個session而且生成一個與此session相關聯的sessionid,sessionid的值應該是一個既不會重複,又不容易被找到規律以仿造的字符串,這個sessionid將被在本次響應中返回給客戶端以cookie的形式保存。 session在大訪問量網站上確實影響系統性能,影響性能的緣由之一由文件系統設計形成,在同一個目錄下超過10000個文件時,文件的定位將很是耗時。另外就是小文件的效率問題,通常咱們的session數據都不會太大(1~2K),若是有大量這樣1~2K的文件在磁盤上,IO效率確定會不好,咱們能夠採用改寫session存儲機制,好比存放到數據庫中
14 寫出一個能建立多級目錄的PHP函數
<?php /** * 建立多級目錄 * @param $path string 要建立的目錄 * @param $mode int 建立目錄的模式,在windows下可忽略 */ function create_dir($path,$mode = 0777) { if (is_dir($path)) { # 若是目錄已經存在,則不建立 echo "該目錄已經存在"; } else { # 不存在,建立 if (mkdir($path,$mode,true)) { echo "建立目錄成功"; } else { echo "建立目錄失敗"; } } } ?>
15 請寫一段PHP代碼,確保多個進程同時寫入同一個文件成功?
$fp = fopen("lock.txt","w+"); if (flock($fp,LOCK_EX)) { //得到寫鎖,寫數據 fwrite($fp, "write something"); // 解除鎖定 flock($fp, LOCK_UN); } else { echo "file is locking..."; } fclose($fp);
16 寫一個函數,儘量高效的,從一個標準url裏取出文件的擴展名,例如:http://www.sina.com.cn/abc/de/fg.php?id=1須要取出php或.php
<?php // 方案一 function getExt1($url){ $arr = parse_url($url); //Array ( [scheme] => http [host] => www.sina.com.cn [path] => /abc/de/fg.php [query] => id=1 ) $file = basename($arr['path']); $ext = explode('.', $file); return $ext[count($ext)-1]; } // 方案二 function getExt2($url){ $url = basename($url); $pos1 = strpos($url,'.'); $pos2 = strpos($url,'?'); if (strstr($url,'?')) { return substr($url,$pos1+1,$pos2-$pos1-1); } else { return substr($url,$pos1); } } $path = "http://www.sina.com.cn/abc/de/fg.php?id=1"; echo getExt1($path); echo "<br />"; echo getExt2($path); ?>
17 寫一個函數,可以遍歷一個文件夾下的全部文件和子文件夾
<?php function my_scandir($dir){ $files = array(); if(is_dir($dir)){ if ($handle = opendir($dir)) { while (($flie = readdir($handle))!== false) { if ($flie!="." && $file!="..") { if (is_dir($dir."/".$file)) { $files[$file] = my_scandir($dir."/".$file); } else { $files[] = $dir."/".$file; } } } closedir($handle); return $files; } } } ?>
18 簡述論壇中無限分類的實現原理
1 建立表 CREATE TABLE category( cat_id smallint unsigned not null auto_increment primary key comment'類別ID', cat_name VARCHAR(30)NOT NULL DEFAULT''COMMENT'類別名稱', parent_id SMALLINT UNSIGNED NOT NULL DEFAULT 0 COMMENT'類別父ID' )engine=MyISAM charset=utf8; 2 編寫一個函數,遞歸遍歷,實現無限分類 <?php function tree($arr,$pid=0,$level=0){ static $list = array(); foreach ($arr as $v) { //若是是頂級分類,則將其存到$list中,並以此節點爲根節點,遍歷其子節點 if ($v['parent_id'] == $pid) { $v['level'] = $level; $list[] = $v; tree($arr,$v['cat_id'],$level+1); } } return $list; } ?>
19 寫一個函數,算出兩個文件的相對路徑,如a=′/a/b/c/d/e.php′;b='/a/b/12/34/c.php';計算出b相對於a的相對路徑應該是../../c/d
<?php function releative_path($path1,$path2){ $arr1 = explode("/",dirname($path1)); $arr2 = explode("/",dirname($path2)); for ($i=0,$len = count($arr2); $i < $len; $i++) { if ($arr1[$i]!=$arr2[$i]) { break; } } // 不在同一個根目錄下 if ($i==1) { $return_path = array(); } // 在同一個根目錄下 if ($i != 1 && $i < $len) { $return_path = array_fill(0, $len - $i,".."); } // 在同一個目錄下 if ($i == $len) { $return_path = array('./'); } $return_path = array_merge($return_path,array_slice($arr1,$i)); return implode('/',$return_path); } $a = '/a/b/c/d/e.php'; $b = '/a/b/12/34/c.php'; $c = '/e/b/c/d/f.php'; $d = '/a/b/c/d/g.php'; echo releative_path($a,$b);//結果是../../c/d echo "<br />"; echo releative_path($a,$c);//結果是a/b/c/d echo "<br />"; echo releative_path($a,$d);//結果是./ echo "<br />"; ?>
20 使對象能夠像數組同樣進行foreach循環,要求屬性必須是私有。(Iterator模式的PHP5實現,寫一類實現Iterator接口)
<?php class Test implements Iterator{ private $item = array('id'=>1,'name'=>'php'); public function rewind(){ reset($this->item); } public function current(){ return current($this->item); } public function key(){ return key($this->item); } public function next(){ return next($this->item); } public function valid(){ return($this->current()!==false); } } //測試 $t=new Test; foreach($t as $k=>$v){ echo$k,'--->',$v,'<br/>'; } ?>
21 用PHP實現一個雙向隊列
<?php class Deque{ private $queue=array(); public function addFirst($item){ return array_unshift($this->queue,$item); } public function addLast($item){ return array_push($this->queue,$item); } public function removeFirst(){ return array_shift($this->queue); } public function removeLast(){ return array_pop($this->queue); } } ?>
22 請使用排序法對如下一組數據進行排序10 2 36 14 10 25 23 85 99 45。
<?php // 冒泡排序 function bubble_sort(&$arr){ for ($i=0,$len=count($arr); $i < $len; $i++) { for ($j=1; $j < $len-$i; $j++) { if ($arr[$j-1] > $arr[$j]) { $temp = $arr[$j-1]; $arr[$j-1] = $arr[$j]; $arr[$j] = $temp; } } } } // 測試 $arr = array(10,2,36,14,10,25,23,85,99,45); bubble_sort($arr); print_r($arr); //快速排序 function quick_sort($arr) { //先判斷是否須要繼續進行 $length = count($arr); if($length <= 1) { return $arr; } //若是沒有返回,說明數組內的元素個數 多餘1個,須要排序 //選擇一個標尺 //選擇第一個元素 $base_num = $arr[0]; //遍歷 除了標尺外的全部元素,按照大小關係放入兩個數組內 //初始化兩個數組 $left_array = array();//小於標尺的 $right_array = array();//大於標尺的 for($i=1; $i<$length; $i++) { if($base_num > $arr[$i]) { //放入左邊數組 $left_array[] = $arr[$i]; } else { //放入右邊 $right_array[] = $arr[$i]; } } //再分別對 左邊 和 右邊的數組進行相同的排序處理方式 //遞歸調用這個函數,並記錄結果 $left_array = quick_sort($left_array); $right_array = quick_sort($right_array); //合併左邊 標尺 右邊 return array_merge($left_array, array($base_num), $right_array); } quick_sort($arr); print_r($arr);
//選擇排序(不穩定) 選擇排序法的思路:就是再第一次循環中,假設第一個數是最小的;而後跟第二個數比較,一直比到最後,找出最小值,而後把最小值跟第一個數的位置互換;再進行下一次循環,找出最小值跟第二個位置的數互換;一直循環數組的個數減去1次;數組就成了有序的了 */ //用函數封裝選擇排序法 function select_sort(&$arr) //注意此處要加地址傳遞符號;由於數組默認傳遞的是值,不是地址;若不地址傳遞,排序的是$arr而不是$asd。 { //$arr = array(1,5,3,9,4,8,12,3,0,7,7.6,3.4,6); //定義一箇中間變量 $temp = 0; //升序排序 for($i=0;$i<count($arr)-1;$i++) { //假設$i就是最小的數 $minVal=$arr[$i]; //記錄我認爲最小數的下標 $minIndex=$i; for($j=$i+1;$j<count($arr);$j++) { //若是我認爲的最小值不是最小 if($minVal>$arr[$j]) { $minVal = $arr[$j]; $minIndex = $j; } } //最後交換 $temp = $arr[$i]; $arr[$i] = $arr[$minIndex]; $arr[$minIndex] = $temp; } return $arr; } select_sort($arr); print_r($arr);
//插入排序法 //插入排序法思路:將要排序的元素插入到已經 假定排序號的數組的指定位置。 function insert_sort($arr) { //區分 哪部分是已經排序好的 //哪部分是沒有排序的 //找到其中一個須要排序的元素 //這個元素 就是從第二個元素開始,到最後一個元素都是這個須要排序的元素 //利用循環就能夠標誌出來 //i循環控制 每次須要插入的元素,一旦須要插入的元素控制好了, //間接已經將數組分紅了2部分,下標小於當前的(左邊的),是排序好的序列 for($i=1, $len=count($arr); $i<$len; $i++) { //得到當前須要比較的元素值。 $tmp = $arr[$i]; //內層循環控制 比較 並 插入 for($j=$i-1;$j>=0;$j--) { //$arr[$i];//須要插入的元素; $arr[$j];//須要比較的元素 if($tmp < $arr[$j]) { //發現插入的元素要小,交換位置 //將後邊的元素與前面的元素互換 $arr[$j+1] = $arr[$j]; //將前面的數設置爲 當前須要交換的數 $arr[$j] = $tmp; } else { //若是碰到不須要移動的元素 //因爲是已經排序好是數組,則前面的就不須要再次比較了。 break; } } } //將這個元素 插入到已經排序好的序列內。 //返回 return $arr; } insert_sort($arr); print_r($arr); ?>
23 寫出一種排序算法(要寫出代碼),並說出優化它的方法
<?php //快速排序 function partition(&$arr,$low,$high){ $pivotkey = $arr[$low]; while($low<$high){ while($low < $high && $arr[$high] >= $pivotkey){ $high--; } $temp = $arr[$low]; $arr[$low] = $arr[$high]; $arr[$high] = $temp; while($low < $high && $arr[$low] <= $pivotkey){ $low++; } $temp=$arr[$low]; $arr[$low]=$arr[$high]; $arr[$high]=$temp; } return$low; } function quick_sort(&$arr,$low,$high){ if($low < $high){ $pivot = partition($arr,$low,$high); quick_sort($arr,$low,$pivot-1); quick_sort($arr,$pivot+1,$high); } } ?>
24 一羣猴子排成一圈,按1,2,...,n依次編號。而後從第1只開始數,數到第m只,把它踢出圈,從它後面再開始數,再數到第m只,在把它踢出去...,如此不停的進行下去,直到最後只剩下一隻猴子爲止,那隻猴子就叫作大王。要求編程模擬此過程,輸入m、n,輸出最後那個大王的編號。
<?php // 方案一,使用php來模擬這個過程 function king($n,$m){ $mokey = range(1, $n); $i = 0; while (count($mokey) >1) { $i += 1; $head = array_shift($mokey);//一個個出列最前面的猴子 if ($i % $m !=0) { #若是不是m的倍數,則把猴子返回尾部,不然就拋掉,也就是出列 array_push($mokey,$head); } // 剩下的最後一個就是大王了 return $mokey[0]; } } // 測試 echo king(10,7); // 方案二,使用數學方法解決 function josephus($n,$m){ $r = 0; for ($i=2; $i <= $m ; $i++) { $r = ($r + $m) % $i; } return $r+1; } // 測試 print_r(josephus(10,7)); ?>
25 寫一個二維數組排序算法函數,可以具備通用性,能夠調用php內置函數。
<?php //二維數組排序,$arr是數據,$keys是排序的健值,$order是排序規則,1是降序,0是升序 function array_sort($arr,$keys,$order=0){ if(!is_array($arr)){ return false; } $keysvalue=array(); foreach($arr as $key => $val){ $keysvalue[$key] = $val[$keys]; } if($order == 0){ asort($keysvalue); }else{ arsort($keysvalue); } reset($keysvalue); foreach($keysvalue as $key => $vals){ $keysort[$key] = $key; } $new_array=array(); foreach($keysort as $key=> $val){ $new_array[$key]=$arr[$val]; } return$new_array; } //測試 $person=array( array('id'=>2,'name'=>'zhangsan','age'=>23), array('id'=>5,'name'=>'lisi','age'=>28), array('id'=>3,'name'=>'apple','age'=>17) ); $result = array_sort($person,'name',1); print_r($result); ?>
26 描述順序查找和二分查找(也叫作折半查找)算法,順序查找必須考慮效率,對象能夠是一個有序數組
<?php /** * 順序查找 * @param array $arr 數組 * @param $k 要查找的元素 * @return mixed 成功返回數組下標,失敗返回-1 */ function seq_sch($arr,$k){ for ($i=0,$n = count($arr); $i < $n; $i++) { if ($arr[$i] == $k) { break; } } if($i < $n){ return $i; }else{ return -1; } } /** * 二分查找,要求數組已經排好順序 * @param array $array 數組 * @param int $low 數組起始元素下標 * @param int $high 數組末尾元素下標 * @param $k 要查找的元素 * @return mixed 成功時返回數組下標,失敗返回-1 */ function bin_sch($array,$low,$high,$k){ if ($low <= $high) { $mid = intval(($low + $high) / 2); if ($array[$mid] == $k) { return $mid; } elseif ($k < $array[$mid]) { return bin_sch($array,$low,$mid - 1,$k); } else{ return bin_sch($array,$mid + 1,$high,$k); } } return -1; } // 測試:順序查找 $arr1 = array(9,15,34,76,25,5,47,55); echo seq_sch($arr1,47);//結果爲6 echo "<br />"; // 測試:二分查找 $arr2 = array(5,9,15,25,34,47,55,76); echo bin_sch($arr2,0,7,47);//結果爲5 ?>
27 咱們但願開發一款撲克遊戲,請給出一套洗牌算法,公平的洗牌並將洗好的牌存儲在一個整形數組裏
<?php $card_num = 54;//牌數 function wash_card($card_num){ $cards = $tmp = array(); for($i = 0;$i < $card_num;$i++){ $tmp[$i] = $i; } for($i = 0;$i < $card_num;$i++){ $index = rand(0,$card_num-$i-1); $cards[$i] = $tmp[$index]; unset($tmp[$index]); $tmp = array_values($tmp); } return $cards; } // 測試: print_r(wash_card($card_num)); ?>
28 php實現線性表順序存儲(增刪查改)
class linearList { private $arr; private $length; const MAXSIZE=100; /* *構造函數,判斷空表仍是飛空表,而且進行實例化 * @param array $arr 輸入的數組 * @param int $n 輸入數組的長度 * @ruturn void; */ function __construct($arr,$n) { if($n>self::MAXSIZE) { echo '對不起,數組的長度'.$n.'超出了內存空間!'.self::MAXSIZE; } else if($n<0) { echo '異常,長度不能爲負數。'; } else if($n==0) { echo '<br/>....你建立了一張空表,數組長度爲0....<br/><br/>'; $this->arr=$arr; $this->length=$n; }else{ echo '<br/>....成功建立一張表....<br/><br/>'; $this->arr=$arr; $this->length=$n; } } /* *按位查找,返回查找到的值 * @ruturn string; * @param int $n 查找的位置 */ function findValue($n) { if($n>$this->length||$n<1){ return '輸入的位置'.$n.'不正確,請在1到'.$this->length.'的範圍內'; } return '你要找的第'.$n.'位的值爲'.$this->arr[$n-1]; } /* *按值查找,返回查找到的位置 * @ruturn string; * @param int $n 查找的值 */ function findSite($n) { for($i=0;$i<$this->length;$i++){ if($this->arr[$i]==$n){ $b=$i+1; return '你要找的值'.$n.'對應的位置爲'.$b; }else{ $v=false; } } if(!$v){ return '你所找的值'.$n.'不存在'; } } /* *在選定的位置處插入某個值 * @ruturn array; * @param int $i 插入位置 * @param int $v 插入的值 */ function insertValue($i,$v) { if($i<1||$i>self::MAXSIZE){ echo '插入的位置'.$i.'不正確,請在1到'.self::MAXSIZE.'的範圍內'; return ; } for($h=$this->length;$h>=$i;$h--){ $this->arr[$h]=$this->arr[$h-1]; } if($i>$this->length){ $this->arr[$this->length]=$v; }else{ $this->arr[$i-1]=$v; } $this->length++; return $this->arr; } /* *在選定的位置刪除某個值 * @ruturn array; * @param int $i 位置 */ function deleteValue($i) { if($i<1||$i>$this->length){ echo '選定的位置'.$i.'不正確,請在1到'.$this->length.'的範圍內'; return ; } for($j=$i;$j<$this->length;$j++){ $this->arr[$j-1]=$this->arr[$j]; } unset($this->arr[$this->length-1]); $this->length--; return $this->arr; } function __destruct(){ if($this->length==0){ echo '<br/>...銷燬一張空表...<br/>'; }else{ echo '<br/>...成功銷燬一張表..<br/>'; } } } //下面是使用案例 $arr=array(10,125,123,1,4); $n=5; $linearList=new linearList($arr, $n); echo $linearList->findValue(5).'<br/>'; echo $linearList->findSite(4).'<br/>'; echo '<pre>'; print_r($linearList->insertValue(20,300)); echo '</pre>'; echo '<pre>'; print_r($linearList->deleteValue(1)); echo '</pre>';
29 用PHP模擬順序棧的基本操做
class Stack{ //用默認值直接初始化棧了,也可用構造方法初始化棧 private $top = -1; private $maxSize = 5; private $stack = array(); //入棧 public function push($elem){ if($this->top >= $this->maxSize-1){ echo "棧已滿!<br/>"; return; } $this->top++; $this->stack[$this->top] = $elem; } //出棧 public function pop(){ if($this->top == -1){ echo "棧是空的!"; return ; } $elem = $this->stack[$this->top]; unset($this->stack[$this->top]); $this->top--; return $elem; } //打印棧 public function show(){ for($i=$this->top;$i>=0;$i--){ echo $this->stack[$i]." "; } echo "<br/>"; } } $stack = new Stack(); $stack->push(3); $stack->push(5); $stack->push(8); $stack->push(7); $stack->push(9); $stack->push(2); $stack->show(); $stack->pop(); $stack->pop(); $stack->pop(); $stack->show();
30 斐波那契數列 1 1 2 3 5 8 13 21 34 55 第n個數值
非遞歸寫法: function fbnq($n){ //傳入數列中數字的個數 if($n <= 0){ return 0; } $array[1] = $array[2] = 1; //設第一個值和第二個值爲1 for($i=3;$i<=$n;$i++){ //從第三個值開始 $array[$i] = $array[$i-1] + $array[$i-2]; //後面的值都是當前值的前一個值加上前兩個值的和 } return $array; } 遞歸寫法: function fbnq($n){ if($n <= 0) return 0; if($n == 1 || $n == 2) return 1; return fbnq($n - 1) + fbnq($n - 2); }