PHP新手面試題集

PHP新手面試題集

第一份:

PHP新手面試題100

簡述題(50)
1
、用PHP打印出前一天的時間格式是2006-5-10 22:21:21(2
)
echo date('Y-m-d H:i:s', strtotime('-1 day'));
2
echo(),print(),print_r()的區別(3
)
echo
PHP語句, printprint_r是函數,語句沒有返回值,函數可以有返回值(即便沒有用
)  
print
只能打印出簡單類型變量的值(
int,string)  
print_r
可以打印出複雜類型變量的值(如數組,對象
)  
echo --
輸出一個或者多個字符串
 
3
、能夠使HTMLPHP分離開使用的模板(1
)
smarty
Heyes Template Class0

常見的還有PHPLib,FastTemplate,Savant這裏有個模板引擎列表:
http://www.sitepoint.com/forums/showthread.php?t=123769

5
、使用哪些工具進行版本控制?(1)

CVSSVN,SVN號稱下一代CVS,功能強大,不過CVS是老牌,市佔率很高
VS Server on Apache
作服務端,WinCVS作客戶端;Subversion on Apache/DAV 做服務端,TortoiseSVN做客戶端,或者Subclipse做客戶端.
6
、如何實現字符串翻轉?(3)
strrev()

不準用PHP內置的就自己寫:
function strrev($str)
{
    $len=strlen($str);
    $newstr = '';
    for($i=$len;$i>=0;$i--)
    {
        $newstr .= $str{$i};
    }
    return $newstr;
}
7
、優化MYSQL數據庫的方法(4分,多寫多得
)
(1).
選取最適用的字段屬性,應該儘量把字段設置爲NOT NULL,這樣在將來執行查詢的時候,數據庫不用去比較NULL值。

(2).
使用連接(JOIN)來代替子查詢(Sub-Queries)
(3).
使用聯合(UNION)來代替手動創建的臨時表

(4).
儘量少使用 LIKE 關鍵字和通配符
(5).
使用事務和外鍵
8
PHP的意思(1
)
Hypertext Preprocessor

9
MYSQL取得當前時間的函數是?,格式化日期的函數是(2)
now(), DATE_FORMAT(date,format)

10
、實現中文字串截取無亂碼的方法。(3)
mb_substr()

11
、您是否用過版本控制軟件? 如果有您用的版本控制軟件的名字是?(1)
TortoiseSVN-1.2.6 svn-1.2.3
12
、您是否用過模板引擎? 如果有您用的模板引擎的名字是?(1
)
smarty

Smarty,Dwoo,TinyButStrong,Template Lite,Savant,phemplate,XTemplate
13、請簡單闡述您最得意的開發之作(4)

自由發揮
14
、對於大流量的網站,您採用什麼樣的方法來解決訪問量問題?(4)
首先,確認服務器硬件是否足夠支持當前的流量

其次,優化數據庫訪問。
第三,禁止外部的盜鏈。
第四,控制大文件的下載。
第五,使用不同主機分流主要流量
第六,使用流量分析統計軟件。
15、用PHP寫出顯示客戶端IP與服務器IP的代碼1)

//客戶端IP
function get_client_ip() {#
 if(getenv('HTTP_CLIENT_IP')) {
  $client_ip = getenv('HTTP_CLIENT_IP');
 } elseif(getenv('HTTP_X_FORWARDED_FOR')) {
  $client_ip = getenv('HTTP_X_FORWARDED_FOR');
 } elseif(getenv('REMOTE_ADDR')) {
  $client_ip = getenv('REMOTE_ADDR');
 } else {
  $client_ip = $HTTP_SERVER_VAR['REMOTE_ADDR'];
 }
 return $client_ip;
}

//服務器IP
    function get_server_ip(){
        if (isset($_SERVER)) {
       if($_SERVER['SERVER_ADDR'])

$server_ip=$_SERVER['SERVER_ADDR'];
            else $server_ip=$_SERVER['LOCAL_ADDR'];
        } else {
            $server_ip=getenv('SERVER_ADDR');
        }
        return $server_ip;
    }
更簡單的方式:
echo $_SERVER['REMOTE_ADDR'];
echo $_SERVER['SERVER_ADDR'];
16、語句includerequire的區別是什麼?爲避免多次包含同一文件,可用(?)語句代替它們? (2)
require()
include()除了怎樣處理失敗之外在各方面都完全一樣。include()產生一個警告而require()則導致一個致命錯誤。

換句話說,如果你想在丟失文件時停止處理頁面,require()include()  就不是這樣,腳本會繼續運行。
require()
無論如何都會包含文件,include()可以有選擇地包含.
代替用
0.
include_once
require_once
17
、如何修改SESSION的生存時間(1).

方法1:php.ini中的session.gc_maxlifetime設置爲9999重啓apache
方法2: $savePath = "./session_save_dir/";
$lifeTime = 24 * 3600;
session_save_path($savePath);
session_set_cookie_params($lifeTime);
session_start();
18
、有一個網頁地址, 比如PHP開發資源網主頁: http://www.phpres.com/index.html,如何得到它的內容?($1)

方法1(對於PHP5及更高版本):
   $readcontents = fopen("
http://www.phpres.com/index.html", "rb");
   $contents = stream_get_contents($readcontents);
   fclose($readcontents);
   echo $contents;
 
方法2:
file_get_contents($url)

19
、在HTTP 1.0中,狀態碼401的含義是(?);如果返回找不到文件的提示,則可用 header 函數,其語句爲(?);(2)
未授權(
Unauthorized)
Header("http/1.0 403 Forbidden");

12
、在PHP中,heredoc是一種特殊的字符串,它的結束標誌必須?(1)
跟起始的一樣,且結束標誌前也要一個換行,後面加上分號.

heredoc的語法是用"<<<"加上自己定義成對的標籤,在標籤範圍內的文字視爲一個字符串
  
例子:
   $str = <<<SHOW
   my name is Jiang Qihui!
   SHOW;

13、談談asp,php,jsp的優缺點(1)

:ASP全名Active Server Pages,是一個WEB服務器端的開發環境, 利用它可以產生和運行動態的、交互的、高性能的WEB服務應用程序。ASP採用腳本語言VB ScriptJava script)作爲自己的開發語言。
  PHP是一種跨平臺的服務器端的嵌入式腳本語言. 它大量地借用C,JavaPerl語言的語法, 並耦合PHP自己的特性,使WEB開發者能夠快速地寫出動態生成頁面.它支持目前絕大多數數據庫。還有一點,PHP是完全免費的,不用花錢,你可以從PHP官方站點(http://www.php.net)自由下載。而且你可以不受限制地獲得源碼,甚至可以從中加進你自己需要的特色。

  JSP Sun公司推出的新一代站點開發語言,他完全解決了目前ASP,PHP的一個通病-腳本級執行(據說PHP4 也已經在Zend 的支持下,實現編譯運行).Sun 公司藉助自己在Java 上的不凡造詣,將Java Java 應用程序 Java Applet 之外,又有新的碩果,就是Jsp--Java Server PageJsp 可以在ServerletJavaBean的支持下,完成功能強大的站點程序。

  三者都提供在 HTML 代碼中混合某種程序代碼、由語言引擎解釋執行程序代碼的能力。但JSP代碼被編譯成 Servlet 並由 Java 虛擬機解釋執行,這種編譯操作僅在對 JSP 頁面的第一次請求時發生。在 ASP PHPJSP 環境下, HTML 代碼主要負責描述信息的顯示樣式,而程序代碼則用來描述處理邏輯。普通的 HTML 頁面只依賴於 Web 服務器,而 ASP PHPJSP 頁面需要附加的語言引擎分析和執行程序代碼。程序代碼的執行結果被重新嵌入到HTML 代碼中,然後一起發送給瀏覽器。 ASP PHP JSP三者都是面向 Web 服務器的技術,客戶端瀏覽器不需要任何附加的軟件支持。

14
、談談對mvc的認識(1)

模型(model),視圖(view),控制器(controller)完成的應用程序
由模型發出要實現的功能到控制器,控制器接收組織功能傳遞給視圖;
15、寫出發貼數最多的十個人名字的SQL,利用下表:members(id,username,posts,pass,email)(2)

select members.username
    from members
order by posts DESC
   limit 10

16. 請說明php中傳值與傳引用的區別。什麼時候傳值什麼時候傳引用?(2)

按值傳遞:函數範圍內對值的任何改變在函數外部都會被忽略
按引用傳遞:函數範圍內對值的任何改變在函數外部也能反映出這些修改
優缺點:按值傳遞時,php必須複製值。特別是對於大型的字符串和對象來說,這將會是一個代價很大的操作。按引用傳遞則不需要複製值,對於性能提高很有好處。
17.
PHPerror_reporting這個函數有什麼作用? (1)

用來配置錯誤信息回報的等級
18.
請寫一個函數驗證電子郵件的格式是否正確 (2)

function validateEmail($email)
{
    if(eregi('^[_a-z0-9-]+(.[_a-z0-9-]+)*@[a-z0-9-]+(.[a-z0-9-]+)*$',$email) ){
        return true;
    }else{
        return false;
    }
}

19. 簡述如何得到當前執行腳本路徑,包括所得到參數。(2)

echo $_SERVER['scrīpt_FILENAME']."?".$_SERVER['QUERY_STRING'];
20.如何修改SESSION的生存時間. (1)
setcookie()
session_set_cookie_params($lifeTime)

21
JS表單彈出對話框函數是?獲得輸入焦點函數是? (2)

alert(),prompt(),confirm()
focus()

22JS的轉向函數是?怎麼引入一個外部JS文件?(2)

window.location.href
<scrīpt src=""/>

23foo()@foo()之間有什麼區別?(1)

@foo()控制錯誤輸出
24、如何聲明一個名爲”myclass”的沒有方法和屬性的類? (1)

class myclass{};
25
、如何實例化一個名爲”myclass”對象(1)

$newmyclass = new myclass();
26
、你如何訪問和設置一個類的屬性? (2)

$newmyclass = new myclass();
$temp=$newmyclass->testvalue;
$newmyclass->testvalue="a";

27
mysql_fetch_row() mysql_fetch_array之間有什麼區別? (1)
--------------------------------------------------------------------

mysql_fetch_row -- 從結果集中取得一行作爲枚舉數組
mysql_fetch_array --  
從結果集中取得一行作爲關聯數組,或數字數組,或二者兼有
28GD庫是做什麼用的? (1)

GD庫提供了一系列用來處理圖片的API,使用GD庫可以處理圖片,或者生成圖片。
在網站上GD庫通常用來生成縮略圖或者用來對圖片加水印或者對網站數據生成報表
29
、指出一些在PHP輸入一段HTML代碼的辦法。(1)

print("<table></table>");

echo "<a href='index.php'>aaa</a>";
30、下面哪個函數可以打開一個文件,以對文件進行讀和寫操作?(1) (c)
    (a) fget()  (b) file_open()   (c) fopen()   (d) open_file()
31
、下面哪個選項沒有將 john 添加到users 數組中? (1)
(c)(d)
    (a) $users[] = ‘john’;
    (b) array_add($users,’john’);
    (c) array_push($users,‘john’);
    (d) $users ||= ‘john’;
32
、下面的程序會輸入是否?(1
)
    <?php
      $num = 10;
      function multiply(){
        $num = $num * 10;
      }
      multiply();
      echo $num;
    ?>
否,局部變量
33
、使用php寫一段簡單查詢,查出所有姓名爲張三的內容並打印出來 (2)
表名
User
Name Tel Content Date
張三 13333663366 大專畢業
2006-10-11
張三 13612312331 本科畢業
2006-10-15
張四 021-55665566 中專畢業
2006-10-15

請根據上面的題目完成代碼

$mysql_db=mysql_connect("local","root","pass");
@mysql_select_db("DB",$mysql_db);

:

$result=mysql_query("select * from User where Name='張三'");
while($row=mysql_fetch_array($result))
{
    echo $row['Name'].$row['Tel'].$row['Content'].$row['Date'];
    echo "<br>";
}

34、如何使用下面的類, 並解釋下面什麼意思?(3)

class test{
   function Get_test($num){
      $num=md5(md5($num)."En");
      return $num;
   }
}

test裏面包含Get_test方法,實例化類調用方法多字符串加密

雙重md5加密
$testObject = new test();
$encryption = $testObject->Get_test("xiaotian_ls");

----------------------------------------------------------------------------
35
、寫出 SQL語句的格式 : 插入 ,更新 ,刪除 (4
)
  
表名
User
   Name Tel Content  Date
  
張三 13333663366  大專畢業
2006-10-11
  
張三 13612312331  本科畢業
2006-10-15
  
張四 021-55665566 中專畢業
2006-10-15
  (a)
有一新記錄(小王 13254748547 高中畢業 2007-05-06)請用SQL語句新增至表中

INSERT INTO User('Name','Tel','Content','Date') VALUES('小王','13254748547','高中畢業','2007-05-06')
  (b)
請用sql語句把張三的時間更新成爲當前系統時間

UPDATE User SET Date=DATE_FORMAT(NOW(),'%Y-%m-%d') WHERE Name='張三'
  (c)
請寫出刪除名爲張四的全部記錄

 DELETE FROM User WHERE Name='張四'
36、請寫出數據類型(int char varchar datetime text)的意思; 請問varcharchar有什麼區別(2)

int 數值類型 char 固定長度字符串 varchar 可變長字符串 datetime 日期時間型 text 字符字符串
char
列的長度固定爲創建表時聲明的長度.varchar列中的值爲可變長字符串.
37MySQ自增類型(通常爲表ID字段)必需將其設爲(?)字段(1)

AUTO_INCREMENT
38、寫出以下程序的輸出結果 (1)
   <?
    $b=201;
    $c=40;
    $a=$b>$c?4:5;
    echo $a;
   ?>

4
39
、檢測一個變量是否有設置的函數是否?是否爲空的函數是?(2)

isset() empty()
-----------------------------------------------------------------------------
40
、取得查詢結果集總數的函數是?(1)

count()
41$arr = array('james', 'tom', 'symfony'); 請打印出第一個元素的值 (1)

echo $arr[0];
42、請將41題的數組的值用','號分隔並合併成字串輸出(1)

echo $arr[0].$arr[1].$arr[2]

43$a = 'abcdef'; 請取出$a的值並打印出第一個字母(1)

echo $a{0};
44PHP可以和sql server/oracle等數據庫連接嗎?(1)

可以
45、請寫出PHP5權限控制修飾符(3)

private protected public
46、請寫出php5的構造函數和析構函數(2)

__construct __destruct

------------------------------------------------------------------------------

47
、以下請用PHPMYADMIN完成


(
)創建新聞發佈系統,表名爲message有如下字段 (3)

id
文章
id
title
文章標題

content
文章內容
category_id
文章分類id
hits
點擊量


CREATE TABLE 'message'(
    'id' int(11) NOT NULL auto_increment,
    'title' varchar(200) default NULL,
    'content' blob,
    'category_id' int(11) default NULL,
    'hits' int(11) default NULL,
    PRIMARY KEY('id')
) ENGINE=InnoDB DEFAULT CHARSET=utf8

()同樣上述新聞發佈系統:表comment記錄用戶回覆內容,字段如下 (4)

comment_id
回覆
id
id
文章id,關聯message表中的
id
comment_content
回覆內容

現通過查詢數據庫需要得到以下格式的文章標題列表,並按照回覆數量排序,回覆最高的排在最前面
文章id 文章標題 點擊量 回覆數量

用一個SQL語句完成上述查詢,如果文章沒有回覆則回覆數量顯示爲0

SELECT message.id id,message.title title,IF(message.`hits` IS NULL,0,message.`hits`) hits,IF(comment.`id` is NULL,0,count(*)) number
FROM message LEFT JOIN comment ON message.id=comment.id
GROUP BY message.`id`


(
)上述內容管理系統,表category保存分類信息,字段如下 (3)

category_id int(4) not null auto_increment;
categroy_name varchar(40) not null;
用戶輸入文章時,通過選擇下拉菜單選定文章分類

寫出如何實現這個下拉菜單

 

function categoryList()
{
    $result=mysql_query("select category_id,categroy_name from category")
            or die("Invalid query: " . mysql_error());
    print("<select name='category' value=''>/n");
    while($rowArray=mysql_fetch_array($result))
    {
        print("<option value='".$rowArray['category_id']."'>".$rowArray['categroy_name']."</option>/n");
    }
    print("</select>");
}

二、PHP文件操作

1)
上述內容管理系統:用戶提交內容後,系統生成靜態HTML頁面;寫出實現的基本思路
 思路:當用戶第一次訪問該文章的時候讀取靜態頁面,如果文件不存在,則生成靜態文件。
            
如果加上有效期的話,同時判斷是否過期,不過期,讀靜態文件,過期重新生成。
  
生成方式:使用輸出控制函數,在文件最後獲取頁面全部信息,並將內容寫到指定的靜態文件中,再此訪問根據判讀選擇訪問
詳細代碼略
2) 簡單描述用戶修改以發佈內容的實現流程和基本思路

1.從數據庫獲取改文章的信息,對應顯示
2.
再進行內容修改,修改完畢,update文章內容即可

 

第二份

一寫出以下程序的輸出結果
var $empty = '';
var $null = NULL;
var $bool = FALSE;
var $notSet;
var $array = array();
1.
$a = "hello";
$b = &$a;
unset($b);
$b = "world";
what is $a?
$a
的結果是hello

2.
$a = 1;
$x = &$a;
$b = $a++;
what is $b?
$b的值爲1;考的是前加與後加的問題

3.
$x = empty($array);
what is $x? true or false

true

4.
$b=201;
$c=40;
$a=$b>$c?4:5;
echo $a;

?>
4

5.

$str="cd";
$$str="hotdog";
$$str.="ok";
echo $cd;
?>
sunny ok

第三份

. 簡答題
1.
請說明php中傳值與傳引用的區別。什麼時候傳值什麼時候傳引用?

按值傳遞:函數範圍內對值的任何改變在函數外部都會被忽略
按引用傳遞:函數範圍內對值的任何改變在函數外部也能反映出這些修改
優缺點:按值傳遞時,php必須複製值。特別是對於大型的字符串和對象來說,這將會是一個代價很大的操作。
按引用傳遞則不需要複製值,對於性能提高很有好處。
2. PHPerror_reporting這個函數有什麼作用?

用來配置錯誤信息回報的等級]
3. 請寫一個函數驗證電子郵件的格式是否正確

function validateEmail($email)
{
    if(eregi('^[_a-z0-9-]+(.[_a-z0-9-]+)*@[a-z0-9-]+(.[a-z0-9-]+)*,$email) ){
        return true;
    }else{
        return false;
    }
}
4. 簡述如何得到當前執行腳本路徑,包括所得到參數。
說明:例如有一個腳本 www.domain.com,傳給他的參數有參數1,參數2,參數3.
傳遞參數的方法有可能是GET有可能是POST,那麼現在請寫出類似

http://www.domain.com/script.php?
參數1=1&參數2=2..... 的結果

echo $_SERVER['PHP_SELF']."?".$_SERVER['QUERY_STRING'];
5.如何修改SESSION的生存時間.

1.    setcookie方式
session_start();
// 保存一天
$lifeTime = 24 * 3600;
setcookie(session_name(), session_id(), time() + $lifeTime, "/");


2.    session_set_cookie_params()方式

其實 Session 還提供了一個函數 session_set_cookie_params(); 來設置 Session 的生存期的,該函數必須在 session_start() 函數調用之前調用:
?php
// 保存一天
$lifeTime = 24 * 3600;
session_set_cookie_params($lifeTime);
session_start();
$_SESSION["admin"] = true;
?
如果客戶端使用 IE 6.0 session_set_cookie_params(); 函數設置 Cookie 會有些問題,所以我們還是手動調用 setcookie 函數來創建 cookie
6..
有一個網頁地址 http://www.domain.com/xxx.php,如何得到它的內容?

file_get_contents($url);
7. 有一個一維數組,裏面存儲整型數據,請寫一個函數,將他們按從大到小的順序排列。

要求執行效率高。並說明如何改善執行效率。(該函數必須自己實現,不能使用php函數)

function BubbleSort(&$arr)
{
    $cnt=count($arr);
    $flag=1;
    for($i=0;$i<$cnt;$i++)
    {
        if($flag==0)
        {
            return;
        }
        $flag=0;
        for($j=0;$j<$cnt-$i-1;$j++)
        {
            if($arr[$j]>$arr[$j+1])
            {
                $tmp=$arr[$j];
                $arr[$j]=$arr[$j+1];
                $arr[$j+1]=$tmp;
                $flag=1;
            }
        }
    }
}
$test=array(1,3,6,8,2,7);
BubbleSort($test);
var_dump($test);
?>
8. 請舉例說明在你的開發過程中用什麼方法來加快頁面的加載速度。
 
 A.生成靜態HTML
    B
.生成
XML
    C.
可不用數據庫的儘量不用數據庫,把變量參數存於文本
.
    D
.用ZEND加速


. 數據庫設計題:
請設計一套圖書館借書管理系統的數據庫表結構;可以記錄基本的用戶信息、圖書信息、借還書信息;數據表的個數不超過6個;請畫表格描述表結構(需要說明每個字段的字段名、字段類型、字段含義描述);
在數據庫設計中應:
1
保證每個用戶的唯一性;
2
.保證每種圖書的唯一性;每種圖書對應不等本數的多本圖書;保證每本圖書的唯一性;
3
.借書信息表中,應同時考慮借書行爲與還書行爲,考慮借書期限;
4
保證借書信息表與用戶表、圖書信息表之間的參照完整性;
5
限制每個用戶最大可借書的本數
6
若有新用戶註冊或新書入庫,保證自動生成其唯一性標識
7
爲以下的一系列報表需求提供支持:
(無特定說明,不需編寫實現語句,而需在數據庫設計中,保證這些報表可以用最多一條SQL語句實現)
a)
日統計報表:當日借書本數、當日還書本數報表;
b)
實時報表:
i.
當前每種書的借出本數、可借本數;
ii.
當前系統中所有超期圖書、用戶的列表及其超期天數
iii.
當前系統中所有用戶借書的本數,分用戶列出(包括沒有借書行爲的用戶);請編寫實現此需求的SQL語句:

數據庫應用:
請撰寫一系列的SQL語句,分別描述完整的借書行爲與還書行爲;並保證這一系列的SQL語句的執行完整性
下題是測驗能力之最重要測試,如不能完成我們將無法給出評判結果!所以請寫出詳細的回答,並保證答案是可以執行的程序。在兩日內將結果通過電子郵件寄到[email protected]郵箱

結合第二題中你的設計,用一種數據庫實現,要求使用三層結構或者多層結構,要求採用面向對象的思想進行編程,有可能的話,設計一套模板機制來實現之。

功能:列出當前借出圖書的情況 ,按日期排列

編號 用戶姓名 書名 書的編號 借出日期
1.
張進 大染坊 12576587 2004-9-1
2.
劉興 西遊記
32131098 2004-9-2
……

第四份

1.PHP中,當前腳本的名稱(不包括路徑和查詢字符串)記錄在預定義變量(1)中;而鏈接到當前頁面的URL記錄在預定義變量(2)中。

1.echo $_SERVER['PHP_SELF'];2. echo $_SERVER["HTTP_REFERER"];
2.執行程序段<?php echo 8%(-3) ?>將輸出(3)。

2
3.
HTTP 1.0中,狀態碼 401 的含義是(4);如果返回“找不到文件”的提示,則可用 header 函數,其語句爲(5)。

(4)未授權 (5) header("HTTP/1.0 404 Not Found");
4.
數組函數 arsort 的作用是(6);語句 error_reporting(2047)的作用是(7)。

(6)對數組進行逆向排序並保持索引關係  (7)All errors and warnings報告所有錯誤和警告
5.PEAR中的數據庫連接字符串格式是(8)。


6.
寫出一個正則表達式,過慮網頁上的所有JS/VBS腳本(即把script標記及其內容都去掉):(9)。

答案:/<[^>].*?>.*?<//>/si

preg_replace("/<script[^>].*?>.*?</script>/si", "newinfo", $script);
7.
Apache模塊的方式安裝PHP,在文件http.conf中首先要用語句(10)動態裝載PHP模塊,然後再用語句(11)使得Apache把所有擴展名爲php的文件都作爲PHP腳本處理。

答案:(10) LoadModule    php5_module "D:/xampp/apache/bin/php5apache2.dll"
       (11) AddType application/x-httpd-php-source .phps
            AddType application/x-httpd-php .php .php5 .php4 .php3 .phtml

8.
語句 include require 都能把另外一個文件包含到當前文件中,它們的區別是(12);爲了避免多次包含同一文件,可以用語句(13)來代替它們。
12.equire()include()除了怎樣處理失敗之外在各方面都完全一樣。include()產生一個警告而require()則導致一個致命錯誤。
換句話說,如果你想在丟失文件時停止處理頁面,require()include() 就不是這樣,腳本會繼續運行。
require()
無論如何都會包含文件,include()可以有選擇地包含.
13.
include_once
require_once

9.類的屬性可以序列化後保存到 session 中,從而以後可以恢復整個類,這要用到的函數是(14)。

serialize() /unserialize()

10.一個函數的參數不能是對變量的引用,除非在php.ini中把(15)設爲on.
allow_call_time_pass_reference
11.SQL
LEFT JOIN的含義是(16)。如果 tbl_user記錄了學生的姓名(name)和學號(ID)tbl_score記錄了學生(有的學生考試以後被開除了,沒有其記錄)的學號(ID)和考試成績(score)以及考試科目(subject),要想打印出各個學生姓名及對應的的各科總成績,則可以用SQL語句(17)。

答案:(16) 自然左外連接
       (17) select name , count(score) as sum_score from tbl_user left join tbl_score on tbl_user.ID=tbl_score.ID  group by tbl_user.ID
12.
PHP中,heredoc是一種特殊的字符串,它的結束標誌必須(18)。
結束標識符所在的行不能包含任何其它字符除";"
13.
寫一個函數,能夠遍歷一個文件夾下的所有文件和子文件夾。
答案:
1.function displaydir($dir) {
$files = array();
    if ( $handle = opendir($dir) )
    {
        while ( ($file = readdir($handle)) !== false )
        {
            if ( $file != ".." && $file != "." )
            {
                if ( is_dir($dir . "/" . $file) )
                {
                    $files[$file] = displaydir($dir . "/" . $file);
                }
                else
                {
                    $files[] = $file;
                }
            }
        }
        closedir($handle);
        return $files;
    }
}
2.
@param string $dir
* @return array
*/
my_scandir($dir)
{
    $files = array();
    if ( $handle = opendir($dir) )
    {
        while ( ($file = readdir($handle)) !== false )
        {
            if ( $file != ".." && $file != "." )
            {
                if ( is_dir($dir . "/" . $file) )
                {
                    $files[$file] = rec_scandir($dir . "/" . $file);
                }
                else
                {
                    $files[] = $file;
                }
            }
        }
        closedir($handle);
        return $files;
    }
}

14.簡述論壇中無限分類的實現原理。

:
<?php
/*
數據表結構如下
:
CREATE TABLE `category` (
 `categoryID` smallint(5) unsigned NOT NULL auto_increment,
 `categoryParentID` smallint(5) unsigned NOT NULL default '0',
 `categoryName` varchar(50) NOT NULL default '',
 PRIMARY KEY (`categoryID`)
) ENGINE=MyISAM DEFAULT CHARSET=gbk;

INSERT INTO `category` ( `categoryParentID`, `categoryName`) VALUES
(0, '
一級類別
'),
(1, '
二級類別
'),
(1, '
二級類別
'),
(1, '
二級類別
'),
(2, '
三級類別
'),
(2, '333332'),
(2, '234234'),
(3, 'aqqqqqd'),
(4, '
哈哈
'),
(5, '66333666');

*/

//指定分類id變量$category_id,然後返回該分類的所有子類
//$default_category
爲默認的選中的分類
function Get_Category($category_id = 0,$level = 0, $default_category = 0)
{
 global $DB;
 $sql = "SELECT * FROM category ORDER BY categoryID DESC";
 $result = $DB->query( $sql );
 while ($rows = $DB->fetch_array($result))
 {
 $category_array[$rows[categoryParentID]][$rows[categoryID]] = array('id' => $rows[categoryID], 'parent' => $rows[categoryParentID], 'name' => $rows

[categoryName]);
 }
 if (!isset($category_array[$category_id]))
 {
 return "";
 }
 foreach($category_array[$category_id] AS $key => $category)
 {
 if ($category['id'] == $default_category)
 {
 echo "<option selected value=".$category['id']."";
 }else
 {
 echo "<option value=".$category['id']."";
 }

 if ($level > 0)
 {
 echo ">" . str_repeat( " ", $level ) . " " . $category['name'] . "</option>/n";
 }
 else
 {
 echo ">" . $category['name'] . "</option>/n";
 }
 Get_Category($key, $level + 1, $default_category);
 }
 unset($category_array[$category_id]);
}

/*
函數返回的數組格式如下所示
:
Array
(
 [1] => Array ( [id] => 1 [name] =>
一級類別
[level] => 0 [ParentID] => 0 )
 [4] => Array ( [id] => 4 [name] =>
二級類別
[level] => 1 [ParentID] => 1 )
 [9] => Array ( [id] => 9 [name] =>
哈哈
[level] => 2 [ParentID] => 4 )
 [3] => Array ( [id] => 3 [name] =>
二級類別
[level] => 1 [ParentID] => 1 )
 [8] => Array ( [id] => 8 [name] => aqqqqqd [level] => 2 [ParentID] => 3 )
 [2] => Array ( [id] => 2 [name] =>
二級類別
[level] => 1 [ParentID] => 1 )
 [7] => Array ( [id] => 7 [name] => 234234 [level] => 2 [ParentID] => 2 )
 [6] => Array ( [id] => 6 [name] => 333332 [level] => 2 [ParentID] => 2 )
 [5] => Array ( [id] => 5 [name] =>
三級類別
[level] => 2 [ParentID] => 2 )
 [10] => Array ( [id] => 10 [name] => 66333666 [level] => 3 [ParentID] => 5 )
)
*/
//
指定分類id,然後返回數組

function Category_array($category_id = 0,$level=0)
{
 global $DB;
 $sql = "SELECT * FROM category ORDER BY categoryID DESC";
 $result = $DB->query($sql);
 while ($rows = $DB->fetch_array($result))
 {
 $category_array[$rows['categoryParentID']][$rows['categoryID']] = $rows;
 }

 foreach ($category_array AS $key=>$val)
 {
 if ($key == $category_id)
 {
 foreach ($val AS $k=> $v)
 {
 $options[$k] =
 array(
 'id' => $v['categoryID'], 'name' => $v['categoryName'], 'level' => $level, 'ParentID'=>$v['categoryParentID']
 );

 $children = Category_array($k, $level+1);

 if (count($children) > 0)
 {
 $options = $options + $children;
 }
 }
 }
 }
 unset($category_array[$category_id]);
 return $options;
}

?>

 

<?php

class cate
{

        function Get_Category($category_id = 0,$level = 0, $default_category = 0)
        {
             echo $category_id;
             $arr = array(
              '0' => array(
                             '1' => array('id' => 1, 'parent' => 0, 'name' => '1111'),
                             '2' => array('id' => 2, 'parent' => 0, 'name' => '2222'),
                            '4' => array('id' => 4, 'parent' => 0, 'name' => '4444')   
                          ),
              '1' => array(
                              '3' => array('id' => 3, 'parent' => 1, 'name' => '333333'),
                            '5' => array('id' => 5, 'parent' => 1, 'name' => '555555')    
                            ),
                         
              '3' => array(
                            '6' => array('id' => 6, 'parent' => 3, 'name' => '66666'),
                            '7' => array('id' => 7, 'parent' => 3, 'name' => '77777')
                            ),
              '4' => array(
                            '8' => array('id' => 8, 'parent' => 4, 'name' => '8888'),
                            '9' => array('id' => 9, 'parent' => 4, 'name' => '9999')
                            )   
             );

             if (!isset($arr[$category_id]))
             {
                return "";
             }
   
             foreach($arr[$category_id] AS $key => $cate)
             {
                 if ($cate['id'] == $default_category)
                 {
                     $txt = "<option selected value=".$cate['id']."";
                 }else{
                     $txt = "<option value=".$cate['id']."";
                 }
           
                 if ($level > 0)
                 {
                    $txt1 = ">" . str_repeat( "-", $level ) . " " . $cate['name'] . "</option>/n";
                 }else{
                     $txt1 = ">" . $cate['name'] . "</option>/n";
                 }
                 $val = $txt.$txt1;
                 echo $val;
                 self::Get_Category($key, $level + 1, $default_category);
             }
           
        }
       
       
        function getFlush($category_id = 0,$level = 0, $default_category = 0)
        {
           
            ob_start();

            self::Get_Category($category_id ,$level, $default_category);

            $out = ob_get_contents();

            ob_end_clean();
            return $out;
        }   
}
$id =$_GET['id'];
echo "<select>";
$c = new cate();
//$c->Get_Category();
$ttt=  $c->getFlush($id,'0','3');
echo $ttt;
echo "</select>";
?>

15.設計一個網頁,使得打開它時彈出一個全屏的窗口,該窗口中有一個文本框和一個按鈕。用戶在文本框中輸入信息後點擊按鈕就可以把窗口關閉,而輸入的信息卻在主網頁中顯示。

Index.php

<html>

<head>

<title>主頁</title>

</head>

<body onload=” window.open('fullwin.php','roc3000','fullscreen')”>

</body>

<table>

<tr>

<td>

<input type=”text “value=”<?php echo $userinput?>”  name=”show”  id=”show”>

</td>

</tr>

</table>

</html>

fullwin.php

<html>

<head>

<title>彈出全屏窗口的網頁</title>

<script>

<!--

function winclosel(){

window.close();

window.open("index.php","","fullscreen=1");

}

//-->

</script>

</head>
<body leftmargin="0" topmargin="0" marginwidth="0" marginheight="0" scroll="no" >
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr><td>

<input type=”text “value=”<?php echo $userinput?>”  name=”userinput”  id=”userinput” onclick=”winclose()”>

</td></tr>

<tr><td>

<input type=”summit “value=”<?php echo $userinput?>”  name=”jump”  id=”jump”

Onclik=>
</td></tr>
</table>

</body>

</html>

:
 toolbar=no 是否顯示工具欄,yes爲顯示;
 menubarscrollbars 表示菜單欄和滾動欄。
 resizable=no 是否允許改變窗口大小,yes爲允許;
 location=no 是否顯示地址欄,yes爲允許;
 status=no 是否顯示狀態欄內的信息(通常是文件已經打開),yes爲允許;
 width=400 窗口寬度;
 height=300 窗口高度;
 top=0 窗口距離屏幕上方的象素值;
 left=0 窗口距離屏幕左側的象素值;

 

<form   name="form1"   method="post"   action='main.php'   onsubmit='window.open("","winName","fullscreen=1")'   target=winName>  

<form   name="form1"   method="post"   action=''   onsubmit='window.open("main.php","","fullscreen=1")'>  

window.open("filename","","fullscreen=1");

window.open(Url,'cscedcLogin',"dependent,alwaysLowered=0,alwaysRaised=0,channelmode=0,dependent=0,directories=0,fullscreen=1,hotkeys=1,location=0,menubar=0,resizable=0,scrollbars=0,status=0,titlebar=0,toolbar=0,z-lock=0,screenX=0,screeny=0,left=0,top=0,toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=no");

3.    關閉前一個窗口??  
   window.opener=null;  
  window.close();

 

面試題6

有一表 menu(mainmenu,submenu,url),請用遞歸法寫出一樹形菜單,將所有的menu列出來。

<html>

 <head><title>JS打印</title></head>

 <body>

 <form>

 <?php

 function GenerateMenu($id=0,$str="")

 {

     $result=mysql_query("select mainmenu,url,submenu from menu where mainmenu=$id");

     while($row=mysql_fetch_array($result))

     {

         echo $str.$row["url"]."<br />";

         GenerateMenu($row["submenu"],$str."--");

     }

     mysql_free_result($result);

 }

 

 $link=mysql_connect("localhost","root","");

 mysql_select_db("phpinterview");

 GenerateMenu();

 mysql_close($link)

 ?>

 </form>

 </body>

 </html>

 

、取得查詢結果集總數的函數是?(1)

mysql_num_rows($res);


面試題7

1-
給你三個數,寫程序求出其最大值。

$var1=1;
$var2=7;
$var3=8;
$max=$var1>$var2?$var1:$var2;
$max=$max>$var3?$max:$var3;
echo $max;

2-
談談asp,php,jsp的優缺點
3-
談談對mvc的認識
4-
寫出發貼數最多的十個人名字的SQL,利用下表:
members(id,username,posts,pass,email)
SELECT username,count(*) as num FROM `members` group by username order by count(*) desc limit 10
面試題8
1-
如何通過javascript判斷一個窗口是否已經被屏蔽。

<script>  

 var   result   =   window.open("/somepage.aspx");  

 if(result==null)  

 {  

        alert("瀏覽器不允許彈出窗口");  

 }  

 </script>


2-
寫出session的運行機制

用戶A訪問站點Y,如果站點Y執行了session_start();(以下假定session_start()總是存在)那麼會產生一個 session_id,這個session id一般會以COOKIE的形式保存到用戶A(我們可以通過在php.ini裏設置session.use_only_cookies1,強制 SESSION ID必須以COOKIE傳遞。)。這時候SESSION ID表現爲$_COOKIE[PHPSESSID];PHPSESSID可用session_name()函數來修改)

用戶A接着訪問,這個session id($_COOKIE[PHPSESSID])就會在A每次訪問Y的時候傳送到站點Y

在站點Y上,會有這麼一個目錄,是用來保存SESSION的實際數據的。站點Y接收到session id,然後通過session id,來獲得與SESSION數據的關聯,並返回SESSION數據。


3-
有一數組 $a=array(4,3,8,9,2);請將其重新排序,按從小到大的順序列出。


4-
防止SQL注射漏洞一般用_____函數。addslashes
5-查詢在線人數,並能處理異常掉線的SQL
....WHERE ________
 

編程題:
1.
寫一個函數,儘可能高效的,從一個標準 url 裏取出文件的擴展名
  
例如: http://www.sina.com.cn/abc/de/fg.php?id=1 需要取出 php .php
答案1:
   function getExt($url){
   $arr = parse_url($url);
  
   $file = basename($arr['path']);
   $ext = explode(".",$file);
   return $ext[1];
}
答案2:
    function getExt($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);
    }
}


2.
HTML 語言中,頁面頭部的 meta 標記可以用來輸出文件的編碼格式,以下是一個標準的 meta 語句
  請使用 PHP 語言寫一個函數,把一個標準 HTML 頁面中的類似 meta 標記中的 charset 部分值改爲 big5
  請注意:
  1. 需要處理完整的 html 頁面,即不光此 meta 語句
  2. 忽略大小寫
    3. '
" 在此處是可以互換的
    4. 'Content-Type'
兩側的引號是可以忽略的,但 'text/html; charset=gbk' 兩側的不行
  5. 注意處理多餘空格

3. 寫一個函數,算出兩個文件的相對路徑
  如 $a = '/a/b/c/d/e.php';
  $b = '/a/b/12/34/c.php';
  計算出 $b 相對於 $a 的相對路徑應該是 ../../c/d()添上
:function getRelativePath($a, $b) {  
    $returnPath = array(dirname($b));  
    $arrA = explode('/', $a);  
    $arrB = explode('/', $returnPath[0]);  
    for ($n = 1, $len = count($arrB); $n < $len; $n++) {  
        if ($arrA[$n] != $arrB[$n]) {  
            break;  
        }   
    }  
    if ($len - $n > 0) {  
        $returnPath = array_merge($returnPath, array_fill(1, $len - $n, '..'));  
    }  
      
    $returnPath = array_merge($returnPath, array_slice($arrA, $n));  
    return implode('/', $returnPath);  
   }  
   echo getRelativePath($a, $b); 

 

如何實現PHPJSP交互?

題目有點含糊不清,SOAP,XML_RPC,Socket function,CURL都可以實現這些,如果是考PHPJava的整合,PHP內置了這種機制(如果考PHP.NET的整合,也可以這麼回答), 例如$foo = new Java('java.lang.System');

優化MYSQL數據庫的方法:

參考1: 1、選取最適用的字段屬性,儘可能減少定義字段長度,儘量把字段設置NOT NULL,例如'省份,性別',最好設置爲ENUM
2
、使用連接(JOIN)來代替子查詢
:
   a.
刪除沒有任何訂單客戶
:DELETE FROM customerinfo WHERE customerid NOT in(SELECT customerid FROM orderinfo)
   b.
提取所有沒有訂單客戶
:SELECT FROM customerinfo WHERE customerid NOT in(SELECT customerid FROM orderinfo)
   c.
提高b的速度優化
:SELECT FROM customerinfo LEFT JOIN orderid customerinfo.customerid=orderinfo.customerid
   WHERE orderinfo.customerid IS NULL
3
、使用聯合(UNION)來代替手動創建的臨時表

   a.
創建臨時表:SELECT name FROM `nametest` UNION SELECT username FROM `nametest2`
4
、事務處理
:
   a.
保證數據完整性,例如添加和修改同時,兩者成立則都執行,一者失敗都失敗

   mysql_query("BEGIN");
   mysql_query("INSERT INTO customerinfo (name) VALUES ('$name1')";
   mysql_query("SELECT * FROM `orderinfo` where customerid=".$id");
   mysql_query("COMMIT");
5
、鎖定表,優化事務處理:
   a.
我們用一個 SELECT 語句取出初始數據,通過一些計算,用 UPDATE 語句將新值更新到表中。

    
包含有 WRITE 關鍵字的 LOCK TABLE 語句可以保證在 UNLOCK TABLES 命令被執行之前,
    
不會有其它的訪問來對 inventory 進行插入、更新或者刪除的操作
   mysql_query("LOCK TABLE customerinfo READ, orderinfo WRITE");
   mysql_query("SELECT customerid FROM `customerinfo` where id=".$id);
   mysql_query("UPDATE `orderinfo` SET ordertitle='$title' where customerid=".$id);
   mysql_query("UNLOCK TABLES");
6
、使用外鍵,優化鎖定表
   a.
customerinfo裏的customerid映射到orderinfo裏的customerid,
    
任何一條沒有合法的customerid的記錄不會寫到orderinfo

   CREATE TABLE customerinfo
   (
     customerid INT NOT NULL,
     PRIMARY KEY(customerid) 
   )TYPE = INNODB;
   CREATE TABLE orderinfo
   (
     orderid INT NOT NULL,
     customerid INT NOT NULL,
     PRIMARY KEY(customerid,orderid),
     FOREIGN KEY (customerid) REFERENCES customerinfo
     (customerid) ON DELETE CASCADE  
   )TYPE = INNODB;
  
注意:'ON DELETE CASCADE',該參數保證當customerinfo表中的一條記錄刪除的話同時也會刪除order
        
表中的該用戶的所有記錄,注意使用外鍵要定義事務安全類型爲INNODB;

7、建立索引:
   a.
格式
:
   (
普通索引
)->
  
創建:CREATE INDEX <索引名> ON tablename (索引字段
)
  
修改:ALTER TABLE tablename ADD INDEX [索引名] (索引字段
)
  
創表指定索引:CREATE TABLE tablename([...],INDEX[索引名](索引字段
))
   (
唯一索引
)->
  
創建:CREATE UNIQUE <索引名> ON tablename (索引字段
)
  
修改:ALTER TABLE tablename ADD UNIQUE [索引名] (索引字段
)
  
創表指定索引:CREATE TABLE tablename([...],UNIQUE[索引名](索引字段
))
   (
主鍵
)->
  
它是唯一索引,一般在創建表是建立,格式爲
:
   CREATA TABLE tablename ([...],PRIMARY KEY[
索引字段
])
8
、優化查詢語句

   a.
最好在相同字段進行比較操作,在建立好的索引字段上儘量減少函數操作
  
例子1:
   SELECT * FROM order WHERE YEAR(orderDate)<2008;(
)
   SELECT * FROM order WHERE orderDate<"2008-01-01";(
)
  
例子
2:
   SELECT * FROM order WHERE addtime/7<24;(
)
   SELECT * FROM order WHERE addtime<24*7;(
)
  
例子
3:
   SELECT * FROM order WHERE title like "%good%";
   SELECT * FROM order WHERE title>="good" and name<"good";

參考2:(1).數據庫設計方面,這是DBAArchitect的責任,設計結構良好的數據庫,必要的時候,去正規化(英文是這個:denormalize,中文翻譯成啥我不知道),允許部分數據冗餘,避免JOIN操作,以提高查詢效率
(2).
系統架構設計方面,表散列,把海量數據散列到幾個不同的表裏面.快慢表,快表只留最新數據,慢表是歷史存檔.集羣,主服務器Read & write,從服務器read only,或者N臺服務器,各機器互爲Master
(3).(1)
(2)超越PHP Programmer的要求了,會更好,不會沒關係.檢查有沒有少加索引

(4).
寫高效的SQL語句,看看有沒有寫低效的SQL語句,比如生成笛卡爾積的全連接啊,大量的Group Byorder by,沒有limit等等.必要的時候,把數據庫邏輯封裝到DBMS端的存儲過程裏面.緩存查詢結果,explain每一個sql語句
(5).
所得皆必須,只從數據庫取必需的數據,比如查詢某篇文章的評論數,select count(*) ... where  article_id = ? 就可以了,不要先select * ... where article_id = ?然後msql_num_rows.
只傳送必須的SQL語句,比如修改文章的時候,如果用戶只修改了標題,那就update ... set title = ?where article_id = ?不要set content = ?(大文本
)
(6).
必要的時候用不同的存儲引擎.比如InnoDB可以減少死鎖.HEAP可以提高一個數量級的查詢速度
.

).數據庫設計方面,設計結構良好的數據庫,允許部分數據冗餘,避免JOIN操作,以提高查詢效率
    (2).
系統架構設計方面,表散列,把海量數據散列到幾個不同的表裏面.快慢表,快表只留最新數據,慢表是歷史存檔.集羣,         服務器Read & write,從服務器read only,或者N臺服務器,各機器互爲Master
    (3).(1)
(2)超越PHP Programmer的要求了,會更好,不會沒關係.檢查有沒有少加索引

    (4).
寫高效的SQL語句,看看有沒有寫低效的SQL語句,比如生成笛卡爾積的全連接啊,大量的Group Byorder by,沒有l        limit等等.必要的時候,把數據庫邏輯封裝到DBMS端的存儲過程裏面.緩存查詢結果,explain每一個sql語句
    (5).
所得皆必須,只從數據庫取必需的數據,比如查詢某篇文章的評論數,select count(*) ... where article_id =  就可以,     不要先select * ... where article_id =  然後msql_num_rows.
   
只傳送必須的SQL語句,比如修改文章的時候,如果用戶只修改了標題,那就update ... set title =   where article_id =  不要    set content =  (大文本
)
    (6).
必要的時候用不同的存儲引擎.比如InnoDB可以減少死鎖.HEAP可以提高一個數量級的查詢速度
.
    (7).
選取最適用的字段屬性,應該儘量把字段設置爲NOT NULL,這樣在將來執行查詢的時候,數據庫不用去比較NULL    值。

    (8).
使用連接(JOIN)來代替子查詢(Sub-Queries)
    (9).
使用聯合(UNION)來代替手動創建的臨時表

    (10).
儘量少使用 LIKE 關鍵字和通配符
    (11).
使用事務和外鍵
談談事務處理

如同是個編程語言都會有答應Hello World的例子一樣,是本數據庫的教材都會講AB的賬戶轉賬50美元的例子,回答這個就好了.不過據我所知,MySQL的企業,很少用MySQL來實現事務處理.何況現在Oracle收購了InnoDB的公司.

可以控制併發事務所產生的數據同步提交,更新問題,就是一個鎖的概念.comit,rollback
apache+mysql+php實現最大負載的方法.
單臺的MYSQL PHP 是不能承擔多大的訪問量,個人的力量畢竟是有限的,機器也是。

   
需要通過負載均衡,將訪問量可以均勻的分攤到不同的機器上,從而實現大的負載承擔能力,
   
一般來說,系統的瓶頸都是卡在數據庫上面,如果對單臺的要求,需要加CACHE,優化APACHEMYSQL,php本身意義不大

問的太籠統,生成靜態html頁面,squid反向代理,apache,mysql的負載均衡.

1.表單中 getpost提交方法的區別?
:get是發送請求HTTP協議通過url參數傳遞進行接收,post是實體數據,可以通過表單提交大量信息.

2.sessioncookie的區別?
:session:儲存用戶訪問的全局唯一變量,存儲在服務器上的php指定的目錄中的(session_dir)的位置進行的存放
   cookie:
用來存儲連續訪問一個頁面時所使用,是存儲在客戶端,對於Cookie來說是存儲在用戶WINTemp目錄中的。
  
兩者都可通過時間來設置時間長短

3.數據庫中的事務是什麼?
:事務(transaction)是作爲一個單元的一組有序的數據庫操作。如果組中的所有操作都成功,則認爲事務成功,即使只有一個操作失敗,事務也不成功。如果所有操作完成,

事務則提交,其修改將作用於所有其他數據庫進程。如果一個操作失敗,則事務將回滾,該事務所有操作的影響都將取消。


javascipt打印上海愛吉

<>
write('
上海愛吉');
</>

PHP面試題系列四【附答案】

1
、假定要使用Apache+Php的配置,並將php3編譯成Apache的一個模塊。那麼以下httpd.conf文件的語句是必須的:【
    A
AddModule mod_php3.c
    B
LoadModule php3_module libexec/libphp3.so
   
CAddType application/x-httpd-php3.php3
    Dsetup
    E
make install

2
PHP支持的數據類型有七種,以下被支持的有:【】
   
Aarray
    B
floating-point numbers(double)
   
Cinteger
    Ddate
   
Estring

3
、以下程序:
<HTML>
<HEAD>
<TITLE></TITLE>
<HEAD>
<BODY>
<?php
    $num1 = 15;
    $num2 = $num1;
    echo "<p>$num2</p>";
    $num2 = &$num1;
    $num2 = 20;
    echo "<p>$num1</p>";
?>
</BODY>
</HTML>

程序輸出爲:[ ]          
    A
15
    B
35
    C
20
    D
5

4
、以下程序
<HTML>
<HEAD>
<TITLE></TITLE>
<HEAD>
<BODY>
<?php
    $str1 = "01";
    $str1++;
    $str1 += 1;
    echo "<p>/$str1 => $str1</p>";
?>
</BODY>
</HTML>
程序輸出爲:[   ]
    A
$str1 => 01
    B
$str1 => 2
    C
$str1 => 03
    D
$str1 => 3
    E
$str1 => 1

5
、全局變量與局部變量

$a=1;
sum()
{
    echo $a;
}
sum();

程序輸出爲:[   ]
    A
1
    B
10
    C
100
    D
1000
    E
、空值

6
PHP的控制語句
<?php
    $a = 3;
    $b = $a++;
    if ($a > $b)
    {
        echo "a
b ";
    }
    elseif ($a == $b)
    {
        echo "a
等於 b";
    }
    else
    {
        echo "a
b ";
    }
?>

輸出結果爲:[   ]
    A
a b
    B
a 等於 b
    C
a b
    D
"a b "
    E
、無輸出

7
include的功能和require一樣,不同的是,require不能用在[   ]
    A
、判斷語句或循環裏,
    B
、連接語句裏
    C
、聲明語句裏
    D
、文件的開頭
    E
、文件的中間

8
PHP對字符串的處理程序
    $name="Jollen";
    echo 'Name:$name';
    echo "Name:$name";
輸出結果爲:[   ]
    A
Name:Jollen
      Name:Jollen
    B
Name:Jollen
      Name:$name
    C
Name:$name
      Name:Jollen
    D
Name:$name
      Name:$name
    E
Name:"Jollen"
      Name:Jollen

9
、數據處理程序
    $string="This is a test.";
    echo ereg_replace(" is"," was",$string)."<br>";
    echo ereg_replace("() is","//1was",$string)."<br>";
    echo ereg_replace("(() is)","//2was",$string)."<br>";
輸出爲:[   ]
    A
This was a test.
      This is a test.
      This was a test.
    B
This is a test.
      This is a test.
      This was a test.
    C
This is a test.
      This is a test.
      This is a test.
    D
This was a test.
      This is a test.
      This is a test.
    E
This was a test.
      This was a test.
      This was a test.

10
、下面建立與MySQL Server的連接語法正確的是:[  ]
    A
$link=connect("host_name","user_name","password");
    B
$link=mysql_connect("host_name","user_name","password");
    C
$link=mysqlconnect("host_name","user_name","password");
    D
$link=mysql_pconnect("host_name","user_name","password");
    E
$link=pconnect("host_name","user_name","password");

11
、下面程序
<?
    $message="abcdefghijklmnopqrstuvwxyz";
    mail("[email protected]", "No topic", $message, "From:
    [email protected]/nReply-To: [email protected]/nX-Mailer: PHP/"
    . phpversion());
?>[   ]
    A
、從[email protected]接收郵件
    B
、發送郵件到[email protected]
    C
、發送郵件到[email protected]
    D
、從[email protected]接收郵件
    E
、不能發送任何郵件

12
rawurlencode()的作用是[   ]
    A
、對PHP3將要輸出的URL部分進行編碼
    B
、對PHP3將要輸入的URL部分進行編碼
    C
、對PHP3已經輸出的URL部分進行編碼
    D
、對PHP3已經輸出的URL部分進行編碼
    E
、對PHP3將要輸出的URL部分進行解碼

13
、假如我們要刪除一個,再建立一個同樣的,應寫成:[  ]
    A
set("fullname");
      set("fullname","Jacky");
    B
set("fullname","Jacky");
    C
set("fullname","Jacky");
      set("fullname");
    D
set("fullname");
    E
sets("fullname","Jacky");
      sets("fullname");
    
14
、如果要在大量的數據裏讀取一個字段的數據,則最好使用mysql_fetch_row()mysql_fetch_array()
mysql_fetch_object()
函數。因爲這幾個函數的速度都比[  ]
    A
mysql_num_rows
    B
mysql_num_fields
    C
mysql_result
    D
mysql_list_fields
    E
mysql_insert_id
來得快。

15
、在PHP中,如果派生類與父類有相同名字的函數,則派生類的函數會替換父類的函數,程序
class A
{
    disName()
    {
        echo "Picachu";
    }
}

class B extends A
{
    var tmp;
    disName()
    {
        echo "Doraemon";
    }
}

$cartoon = new B;
$cartoon->disName();
結果爲:[   ]
    A
tmp
    B
Picachu
    C
disName
    D
Doraemon
    E
、無輸出

答案:

1.[C]

2.[ A B C E ]
PHP
的變量屬於鬆散數據類型,在計算時動態(dynamic)決定。如果要強制設置變量的數據類型的話,可以利用 settype()函數。或利用 c 語言的強制轉型方式(type casting)

3.[ A C ]

4.[ D ]

5.[ E ]

6.[ A ]

7.[ E ]
include可以。

8.[ C ]

9.[ E ]

10.[ B D ]

11.[ C ]

12.[ C D ]

13.[ B ]

14.[ C ]

15.[ D ]

===============================================================================
PHP
面試題系列五【附答案】


一、基礎題

1.
寫出如下程序的輸出結果
<?
    $str1 = null;
    $str2 = false;
    echo $str1==$str2 ? '
相等' : '不相等';
  
    $str3 = '';
    $str4 = 0;
    echo $str3==$str4 ? '
相等' : '不相等';
  
    $str5 = 0;
    $str6 = '0';
    echo $str5===$str6 ? '
相等' : '不相等';
?>


2.
寫出如下程序的輸出結果
<?
    $a1 = null;
    $a2 = false;
    $a3 = 0;
    $a4 = '';
    $a5 = '0';
    $a6 = 'null';
    $a7 = array();
    $a8 = array(array());
  
    echo empty($a1) ? 'true' : 'false';
    echo empty($a2) ? 'true' : 'false';
    echo empty($a3) ? 'true' : 'false';
    echo empty($a4) ? 'true' : 'false';
    echo empty($a5) ? 'true' : 'false';
    echo empty($a6) ? 'true' : 'false';
    echo empty($a7) ? 'true' : 'false';
    echo empty($a8) ? 'true' : 'false';
?>

3.
寫出如下程序的輸出結果
<?
    $test = 'aaaaaa';
    $abc = & $test;
    unset($test);
  
    echo $abc;
?>

4.
寫出如下程序的輸出結果
<?
    $count = 5;
    get_count()
    {
        static $count = 0;
        return $count++;
    }
  
    echo $count;
    ++$count;
    echo get_count();
    echo get_count();
?>

5.
寫出如下程序的輸出結果
<?
    $GLOBALS['var1'] = 5;
    $var2 = 1;
    get_()
    {
        global $var2;
        $var1 = 0;
        return $var2++;
    }
    get_();

    echo $var1;
    echo $var2;
?>

6.
寫出如下程序的輸出結果
<?
    get_arr($arr)
    {
        unset($arr[0]);
    }
    $arr1 = array(1, 2);
    $arr2 = array(1, 2);
  
    get_arr(&$arr1);
    get_arr($arr2);
  
    echo count($arr1);
    echo count($arr2);
?>


7.
使用五種以上方式獲取一個文件的擴展名

要求:dir/upload.image.jpg,找出 .jpg 或者 jpg
必須使用PHP自帶的處理函數進行處理,方法不能明顯重複,可以封裝成函數,比如 get_ext1($file_name), get_ext2($file_name)

二、算法題

1.
使用PHP描述冒泡排序和快速排序算法,對象可以是一個數組

2.
使用PHP描述順序查找和二分查找(也叫做折半查找)算法,順序查找必須考慮效率,對象可以是一個有序數組

3.
寫一個二維數組排序算法函數,能夠具有通用性,可以調用php內置函數

答案(以下答案不一定是最好的,只是一個簡單的參考)

一、基礎題

1.
相等 相等 不相等

2. true true true true true false true false

3. aaaaaa

4. 5 0 1

5. 5 2

6. 1 2

7.
使用五種以上方式獲取一個文件的擴展名

1)
get_ext1($file_name)
{
    return strrchr($file_name, '.');
}

2)
get_ext2($file_name)
{
    return substr($file_name, strrpos($file_name, '.'));
}

3)
get_ext3($file_name)
{
    return array_pop(explode('.', $file_name));
}

4)
get_ext4($file_name)
{
    $p = pathinfo($file_name);
    return $p['extension'];
}

5)
get_ext5($file_name)
{
    return strrev(substr(strrev($file_name), 0, strpos(strrev($file_name), '.')));
}

二、算法題

1.
使用PHP描述冒泡排序和快速排序算法,對象可以是一個數組
//
冒泡排序(數組排序)
bubble_sort($array)
{
    $count = count($array);
    if ($count <= 0)
        return false;
  
    for($i=0; $i<$count; $i++)
    {
        for($j=$count-1; $j>$i; $j--)
        {
            if ($array[$j] < $array[$j-1])
            {
                $tmp = $array[$j];
                $array[$j] = $array[$j-1];
                $array[$j-1] = $tmp;
            }
        }
    }
    return $array;
}

//
快速排序(數組排序)
quick_sort($array)
{
    if (count($array) <= 1)
        return $array;
  
    $key = $array[0];
    $left_arr = array();
    $right_arr = array();
  
    for ($i=1; $i<count($array); $i++)
    {
        if ($array[$i] <= $key)
            $left_arr[] = $array[$i];
        else
            $right_arr[] = $array[$i];
    }
  
    $left_arr = quick_sort($left_arr);
    $right_arr = quick_sort($right_arr);
  
    return array_merge($left_arr, array($key), $right_arr);
}


2.
使用PHP描述順序查找和二分查找(也叫做折半查找)算法,順序查找必須考慮效率,對象可以是一個有序數組

//
二分查找(數組裏查找某個元素)
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;
}

//
順序查找(數組裏查找某個元素)
seq_sch($array, $n, $k)
{
    $array[$n] = $k;
    for($i=0; $i<$n; $i++)
    {
        if($array[$i]==$k)
        {
          break;
        }
    }
    if ($i<$n)
    {
        return $i;
    }
    else
    {
        return -1;
    }
}


3.
寫一個二維數組排序算法函數,能夠具有通用性,可以調用php內置函數

//
二維數組排序, $arr是數據,$keys是排序的健值,$order是排序規則,1是升序,0是降序
array_sort($arr, $keys, $order=0)
{
    if (!is_array($arr))
    {
        return false;
    }
    $keys = array();
    foreach($arr as $key => $val)
    {
        $keys[$key] = $val[$keys];
    }
    if($order == 0)
    {
        asort($keys);
    }
    else
    {
        arsort($keys);
    }
    reset($keys);
    foreach($keys as $key => $vals)
    {
        $keysort[$key] = $key;
    }
    $new_array = array();
    foreach($keysort as $key => $val)
    {
        $new_array[$key] = $arr[$val];
    }
    return $new_array;
}

一、基礎及程序題(建議使用你擅長的語言:C/C++PHPJava

1.
寫一個排序算法,可以是冒泡排序或者是快速排序,假設待排序對象是一個維數組。(提示:不能使用系統已有函數,另外請仔細回憶以前學習過的基礎知識)

2.
實現一個字符串截取的函數,類似於substr,必須能夠截取中文這種多字節編碼。假設每個中文也是一個字符,普通的數字、符號、字母也是一個字符。(提示:GB編碼的中文字符高位範圍是 0x81-0xFE 

3.
寫一個遍歷指定目錄下所有子目錄和子文件的函數(提示:可以使用遞歸的方法)

4.
寫出匹配郵箱地址和URL的兩個正則表達式。類似下面的:
郵箱地址:[email protected]
URL
地址:http://www.example.com.cn/user_profile.php?uid=100
(提示:使用標準的正則表達式,就是PHPpreg_* 類的正則處理函數能夠解析的正則)
二、數據庫技術題

1.
寫出三種以上MySQL數據庫存儲引擎的名稱(提示:不區分大小寫)

2.
說出你所知道的三種以上開源數據庫的名稱(提示:想想目前國外流行的開源數據庫)

3.MySQL
數據庫中的字段類型varcharchar的主要區別是什麼?那種字段的查找效率要高,爲什麼?

4.
說出MySQL 4.0MySQL 4.1版本的最主要的兩個區別。如果你使用過MySQL 5,請說說MySQL 5MySQL 4的主要區別。(後半題選作)

5.MySQL
數據庫基本的三個優化法則是什麼?(提示:從服務配置、應用、開發角度考慮)

二、綜合技術題

1.
請使用JavaScript寫出三種產生一個Image 標籤的方法(提示:從方法、對象、HTML角度考慮)

2.
請使用CSS樣式,描述兩種方法在當前列中只顯示一個div對象

3.
請描述出兩點以上XHTMLHTML最顯著的區別

4.
出五種以上你使用過的PHP的擴展的名稱(提示:常用的PHP擴展)

5.
瞭解MVC模式嗎?請寫出三種以上目前PHP流行的MVC框架名稱(不區分大小寫)
以下爲十個目前最流行的基於MVC設計模式的PHP框架。

  1. Yii

  Yii是一個基於組件的高性能的PHP的框架,用於開發大規模Web應用。Yii採用嚴格的OOP編寫,並有着完善的庫引用以及全面的教程。從MVCDAO/ActiveRecordwidgetscaching,等級式RBACWeb服務,到主體化,I18NL10NYii提供了今日Web 2.0應用開發所需要的幾乎一切功能。而且這個框架的價格也並不太高。事實上,Yii是最有效率的PHP框架之一。

  2. CodeIgniter

  CodeIgniter是一個應用開發框架——一個爲建立PHP網站的人們所設計的工具包。其目標在於快速的開發項目:它提供了豐富的庫組以完成常見的任務,以及簡單的界面,富有條理性的架構來訪問這些庫。使用CodeIgniter開發可以往項目中注入更多的創造力,因爲它節省了大量編碼的時間。

  3. CakePHP

  CakePHP是一個快速開發PHP的框架,其中使用了一些常見的設計模式如ActiveRecordAssociation Data MappingFront Controller以及MVC。其主要目標在於提供一個令任意水平的PHP開發人員都能夠快速開發web應用的框架,而且這個快速的實現並沒有犧牲項目的彈性。

  4. PHPDevShell

  PHPDevShell是一個開源(GNU/LGPL)的快速應用開發框架,用於開發不含Javascript的純PHP。它有一個完整的GUI管理員後臺界面。其主要目標在於開發插件一類的基於管理的應用,其中速度、安全、穩定性及彈性是最優先考慮的重點。其設計形成了一個簡單的學習曲線,PHP開發者無需學習複雜的新術語。PHPDevShell的到來滿足了開發者們對於一個輕量級但是功能完善,可以無限制的進行配置的GUI的需求。

  5. Akelos

  Akelos PHP框架是一個基於MVC設計模式的web應用開發平臺。基於良好的使用習慣,使用它可以完成如下任務:

  方便的使用Ajax編寫views

  通過控制器管理請求(request)及響應(response

  管理國際化的應用

  使用簡單的協議與模型及數據庫通信

  你的Akelos應用可以在大多數共享主機服務供應方上運行,因爲Akelos對服務器唯一的要求就是支持PHP。因此,Akelos PHP框架是理想的用於發佈單獨web應用的框架,因爲它不需要非標準PHP配置便能運行。

  6. Symfony

  

  Symfony是一個用於開發PHP5項目的web應用框架。

  這個框架的目的在於加速web應用的開發以及維護,減少重複的編碼工作。

  Symfony的系統需求不高,可以被輕易的安裝在任意設置上:你只需一個UnixWindows,搭配一個安裝了PHP5的網絡服務器即可。它與差不多所有的數據庫兼容。Symfony的價位不高,相比主機上的花銷要低得多。

  對於PHP開發者而言,使用Symfony是一件很自然的事,其學習曲線只有短短一天。乾淨的設計以及代碼可讀性將縮短開發時間。開發者可以將敏捷開發的原理(如DRYKISSXP等)應用在其中,將重點放在應用邏輯層面上,而不用花費大量時間在編寫沒完沒了的XML配置文件上。

  Symfony旨在建立企業級的完善應用程序。也就是說,你擁有整個設置的控制權:從路徑結構到外部庫,幾乎一切都可以自定義。爲了符合企業的開發條例,Symfony還綁定了一些額外的工具,以便於項目的測試,調試以及歸檔。

  7. Prado

  

  PRADO團隊由一些PRADO狂熱者組成,這些成員開發並推動PRADO框架以及相關項目的進行。

  PRADO的靈感起源於Apache Tapestry。從04年開始,PRADO成爲SourceForge上的開源項目之一。這個項目目前進展到了3.x版本。

  8. Zend

  

  作爲PHP藝術及精神的延伸,Zend框架的基礎在於簡單,面向對象的最佳方法,方便企業的許可協議,以及經過反覆測試的快速代碼庫。Zend框架旨在建造更安全,更可靠的Web 2.0應用及web服務,並不斷從前沿廠商(如GoogleAmazonYahooFlickrStrikeIronProgrammableWeb等)的API那裏吸收精華。

  9. ZooP

  

  Zoop PHP框架,意爲Zoop面向對象的PHP框架。

  這是個穩定,可伸縮並可移植的框架。從誕生到現在的5年間,已經在不少產品開發中被使用。Zoop是一個快速,有效並乾淨的框架。它的伸縮性很好,你可以只安裝你需要的功能。

  對代碼並不很熟悉的開發者也可以通過Zoop快速的開發安全的web應用。熟練的開發者則可以更加將Zoop的彈性利用到極致。

  Zoop建議將displaylogic以及數據層(MVC)分開使用。

  Zoop由很多組件和項目集合而成,其中包括smartyprototype AJAX框架,PEAR模塊等。高效的核心組件提供了很多你原本需要自己編碼來實現的功能。Zoop內置的糾錯功能可以通過配置實現生產環境下的錯誤日誌生成,這個錯誤日誌提供了很多信息,可讀性很高,可以更輕易的尋找並排除錯誤。

  Zoop的一個特別之處在於其GuiControls,在PHP中是一個相當革新的想法。它提供了很多form widgets與驗證完整的集合到一起,並形成了一個可以輕鬆打造個性化GuiControls的框架。

  10. QPHP

  

  QPHP,意爲快速PHP,它是一個與ASP.NET類似的MVC框架。基本上它是這樣一個情況:

  整合了JavaC#的美感

  除去了在其他PHP框架中使用的Perl形式的意義含糊的語言

  大量基於OOP的概念
6.
寫出15個以上你所知道的常用的Linux命令和它的功能

7.
使用過Vim編輯器嗎?如果使用過,如何在vim裏切分多個可視化窗口,包括橫排和縱排。(本題選作)

8.
說說Linux下的find命令和grep命令的區別(本題選作)

9.
請描述出七層網絡模型的名稱,由下到上(可以使用中文描述)

10.
說說下面這些這些協議的全稱和中文解釋(提示:都是工作在應用層)SMTPPOP3HTTPFTPDNS

11.
使用過Memcache緩存嗎,如果使用過,能夠簡單的描述一下它的工作原理嗎?(本題選作)

12.
請大致的說說Session的工作原理。(提示:與Cookie有相應的關係)

13.
說說你所瞭解的搜索引擎包含那些技術?(本題選作)

三、項目及設計題

1.
一個Web開發團隊開發中,大致說說你所瞭解的所有成員的分工合作情況

2.
說說你做過的最得意的項目或者個人開發作品(可以是個人作品,也可以是合作項目)

3.
假設給你5臺服務器,請大致的描述一下,如何使用你所熟悉的開源軟件,搭建一個日PV 300萬左右的中型網站

六、數據庫技術題

6.
寫出三種以上MySQL數據庫存儲引擎的名稱(提示:不區分大小寫)
MyISAM
InnoDBBDBBerkeley DB)、MergeMemoryHeap)、ExampleFederatedArchiveCSVBlackholeMaxDB 等等十幾個引擎

7.
說出你所知道的三種以上開源數據庫的名稱(提示:想想目前國外流行的開源數據庫)
MySQL
SQLiteBDBBerkeley DB)、PostgreSQLFirebird

8.MySQL
數據庫中的字段類型varcharchar的主要區別是什麼?那種字段的查找效率要高,爲什麼?
Varchar
是變長,節省存儲空間,char是固定長度。查找效率要char型快,因爲varchar是非定長,必須先查找長度,然後進行數據的提取,比char定長類型多了一個步驟,所以效率低一些

9.
說出MySQL 4.0MySQL 4.1版本的最主要的兩個區別。如果你使用過MySQL 5,請說說MySQL 5MySQL 4的主要區別。(後半題選作)

MySQL 4.1 
主要是比MySQL 4.0多了子查詢和字符編碼的支持兩個特點。
MySQL5
增加的功能比MySQL4要更多,包括存儲過程、視圖、事務等等

10.MySQL
數據庫基本的三個優化法則是什麼,除了增加硬件和帶寬?(提示:從服務配置、應用、開發角度考慮)
1)系統服務優化,把MySQLkey_buffercache_bufferquery_cache等增加容量
2)給所有經常查詢的字段增加適當的索引
3)優化SQL語句,減少DitinctGroupJoin等等語句的操作

PHP面試題目

一、基礎題

1.
寫出如下程序的輸出結果

<?

$str1 = null;

$str2 = false;

echo $str1==$str2 ? '
相等' : '不相等';

$str3 = '';

$str4 = 0;

echo $str3==$str4 ? '
相等' : '不相等';

$str5 = 0;

$str6 = '0';

echo $str5===$str6 ? '
相等' : '不相等';

?>

2.
寫出如下程序的輸出結果

<?

$a1 = null;

$a2 = false;

$a3 = 0;

$a4 = '';

$a5 = '0';

$a6 = 'null';

$a7 = array();

$a8 = array(array());

echo empty($a1) ? 'true' : 'false';

echo empty($a2) ? 'true' : 'false';

echo empty($a3) ? 'true' : 'false';

echo empty($a4) ? 'true' : 'false';

echo empty($a5) ? 'true' : 'false';

echo empty($a6) ? 'true' : 'false';

echo empty($a7) ? 'true' : 'false';

echo empty($a8) ? 'true' : 'false';

?>

3.
寫出如下程序的輸出結果

<?

$test = 'aaaaaa';

$abc = & $test;

unset($test);

echo $abc;

?>

4.
寫出如下程序的輸出結果

<?$count = 5;

function get_count(){

static $count = 0;

return $count++;

}

echo $count;

++$count;

echo get_count();

echo get_count();

?>

5.
寫出如下程序的輸出結果

<?

$GLOBALS['var1'] = 5;

$var2 = 1;

function get_value(){

global $var2;

$var1 = 0;

return $var2++;

}

get_value();

echo $var1;

echo $var2;

?>

6.
寫出如下程序的輸出結果

<?

function get_arr($arr){

unset($arr[0]);

}

$arr1 = array(1, 2);

$arr2 = array(1, 2);

get_arr(&$arr1);

get_arr($arr2);

echo count($arr1);

echo count($arr2);

?>

7.
使用五種以上方式獲取一個文件的擴展名

要求:dir/upload.image.jpg,找出 .jpg 或者 jpg

必須使用PHP自帶的處理函數進行處理,方法不能明顯重複,可以封裝成函數,比如 get_ext1($file_name), get_ext2($file_name)
二、算法題
1.
使用PHP描述冒泡排序和快速排序算法,對象可以是一個數組
2.
使用PHP描述順序查找和二分查找(也叫做折半查找)算法,順序查找必須考慮效率,對象可以是一個有序數組

3.
寫一個二維數組排序算法函數,能夠具有通用性,可以調用php內置函數

【附答案】(以下答案不一定是最好的,只是一個簡單的參考)

一、基礎題

1.
相等 相等 不相等

2. true true true true true false true false

3. aaaaaa

4. 5 0 1

5. 5 2

6. 1 2

7.
使用五種以上方式獲取一個文件的擴展名

function get_ext1($file_name){

return strrchr($file_name, '.');

}

function get_ext2($file_name){

return substr($file_name, strrpos($file_name, '.'));

}

function get_ext3($file_name){

return array_pop(explode('.', $file_name));

}

function get_ext4($file_name){

$p = pathinfo($file_name);

return $p['extension'];

}

function get_ext5($file_name){

return strrev(substr(strrev($file_name), 0, strpos(strrev($file_name), '.')));

}

二、算法題

1.
使用PHP描述冒泡排序和快速排序算法,對象可以是一個數組

//
冒泡排序(數組排序)

function bubble_sort($array)

{

          $count = count($array);

          if ($count <= 0) return false;

          for($i=0; $i<$count; $i++){

                  for($j=$count-1; $j>$i; $j--){

                          if ($array[$j] < $array[$j-1]){

                                  $tmp = $array[$j];

                                  $array[$j] = $array[$j-1];

                                  $array[$j-1] = $tmp;

                          }

                  }

          }

          return $array;

}

//
快速排序(數組排序)

function quick_sort($array) {

          if (count($array) <= 1) return $array;

          $key = $array[0];

          $left_arr = array();

          $right_arr = array();

          for ($i=1; $i<count($array); $i++){

                  if ($array[$i] <= $key)

                          $left_arr[] = $array[$i];

                  else

                          $right_arr[] = $array[$i];

          }

          $left_arr = quick_sort($left_arr);

          $right_arr = quick_sort($right_arr);

          return array_merge($left_arr, array($key), $right_arr);

}

2.
使用PHP描述順序查找和二分查找(也叫做折半查找)算法,順序查找必須考慮效率,對象可以是一個有序數組

//
二分查找(數組裏查找某個元素)

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;

}

//
順序查找(數組裏查找某個元素)

function seq_sch($array, $n, $k){

      $array[$n] = $k;

      for($i=0; $i<$n; $i++){

          if($array[$i]==$k){

              break;

          }

      }

      if ($i<$n){

          return $i;

      }else{

          return -1;

      }

}

3.
寫一個二維數組排序算法函數,能夠具有通用性,可以調用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;

}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章