php面試題

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';計算出ba的相對路徑應該是../../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);
}
相關文章
相關標籤/搜索