php面試題彙總一(基礎篇附答案)

一份不錯的php面試題,附答案,有準備換工做的同窗能夠參考一下.javascript

1:使用五種以上方式獲取一個文件的擴展名
要求:dir/upload.image.jpg,找出 .jpg 或者 jpg ,
必須使用PHP自帶的處理函數進行處理,方法不能明顯重複,能夠封裝成函數,好比 get_ext1($file_name), get_ext2($file_name)php

解析:html

複製代碼
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){
    return pathinfo($file_name, PATHINFO_EXTENSION);
}
function get_ext5($file_name){
    return strrev(substr(strrev($file_name), 0, strpos(strrev($file_name), '.')));
}
複製代碼

2. 使用PHP描述冒泡排序和快速排序算法,對象能夠是一個數組java

解析:冒泡排序(數組排序)面試

複製代碼
function bubble_sort($array){
    $count = count($array);
    if ($count <= 0) return false;
    for($i=0; $i<$count; $i++){
        for($j=$i; $j<$count-1; $j++){
            if ($array[$i] > $array[$j]){
                $tmp = $array[$i];
                $array[$i] = $array[$j];
                $array[$j] = $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);
}
複製代碼


3. 使用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;
    }
}
複製代碼

4. 寫一個二維數組排序算法函數,可以具備通用性,能夠調用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;
}
複製代碼

 5:抓取遠程圖片到本地,你會用什麼函數?
解析:fsockopen
 6:javascript可否定義二維數組,若是不能你如何解決?

解析:javascript不支持二維數組定義,能夠用arr[0] = new array()來解決

 7:正在瀏覽當前頁面用戶的 IP 地址

解析:

echo $_SERVER["REMOTE_ADDR"]
//查詢的字符串(URL 中第一個問號 ? 以後的內容):id=1&bi=2
echo $_SERVER["QUERY_STRING"]
//當前運行腳本所在的文檔根目錄:d:inetpubwwwroot
echo $_SERVER["DOCUMENT_ROOT"]

八、在HTTP 1.0中,狀態碼 401 的含義是未受權____;若是返回「找不到文件」的提示,則可用 header 函數,其語句爲?
解析:401表示未受權;header(「HTTP/1.0 404 Not Found」);

用PHP打印出前一天的時間,打印格式是2007年5月10日22:21:21

9:請用正則表達式(Regular Expression)寫一個函數驗證電子郵件的格式是否正確。

解析:

複製代碼
<?php
$email=$_POST['email'];
if(!preg_match(‘/^[\w.]+@([\w.]+)\.[a-z]{2,6}$/i’,$email))  {
echo 「電子郵件檢測失敗」;
}else{
echo 「電子郵件檢測成功」;
}
?>
複製代碼

 10:用PHP寫出顯示客戶端IP與服務器IP的代碼

解析:

打印客戶端IP:echo $_SERVER['REMOTE_ADDR'];

或者: getenv('REMOTE_ADDR');
打印服務器IP:echo gethostbyname('www.bolaiwu.com')

11:如何修改SESSION的生存時間(不修改配置php.ini的session.gc_maxlifetime參數)?

解析:session_set_cookie_params($lifeTime);

12:有一個網頁地址, 好比PHP開發資源網主頁: http://www.phpres.com/index.html,如何獲得它的內容?

解析:方法1(對於PHP5及更高版本):

<?
$readcontents = fopen(「http://www.phpres.com/index.html」, 「rb」);
$contents = stream_get_contents($readcontents);
fclose($readcontents);
echo $contents;
?>

方法2:

<?
echo file_get_contents('http://www.phpres.com/index.html');
?>

 1三、請說明php中傳值與傳引用的區別。何時傳值何時傳引用?(2分)

解析:

複製代碼
按值傳遞:函數範圍內對值的任何改變在函數外部都會被忽略

按引用傳遞:函數範圍內對值的任何改變在函數外部也能反映出這些修改

優缺點:按值傳遞時,php必須複製值。特別是對於大型的字符串和對象來講,這將會是一個代價很大的操做。

按引用傳遞則不須要複製值,對於性能提升頗有好處。
複製代碼

 14:寫一個函數,儘量高效的,從一個標準 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);   }  }
複製代碼

15:MySQL數據庫中的字段類型varchar和char的主要區別是什麼?那種字段的查找效率要高,爲何?

解析:

Varchar是變長,節省存儲空間,char是固定長度。查找效率要char型快,由於varchar是非定長,必須先查找長度,而後進行數據的提取,比char定長類型多了一個步驟,因此效率低一些

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

MyISAM、InnoDB、BDB(Berkeley DB)、Merge、Memory(Heap)、Example、Federated、Archive、CSV、Blackhole、MaxDB 等等十幾個引擎

17:請寫一個函數,實現如下功能:
字符串'open_door' 轉換成'OpenDoor'、'make_by_id' 轉換成 'MakeById'。

解析:

複製代碼
方法一:
function str_explode($str){
    $str_arr=explode('_',$str);
    $str_implode=implode('',$str_arr); 
    $str_implode=implode('',explode('',ucwords($str_implode)));
    return $str_implode;
}
$strexplode=str_explode('make_by_id');
print_r($strexplode);
方法二:
$str='make_by_id!';
$expStr=explode('_',$str);
for($i=0;$i<count($expStr);$i++)
{
    echo ucwords($expStr[$i]);
}
方法三:
echo str_replace(' ','',ucwords(str_replace('_',' ','open_door')))
複製代碼

18:一個表中的Id有多個記錄,把全部這個id的記錄查出來,並顯示共有多少條記錄數,用SQL語句及視圖、
存儲過程分別實現。

解析:

複製代碼
DELIMITER //
create procedure proc_countNum(in columnId int,out rowsNo int)
begin
select count(*) into rowsNo from member where member_id=columnId;
end
call proc_countNum(1,@no);
select @no;
方法:視圖:
create view v_countNum as select member_id,count(*) as countNum from member group by
member_id
select countNum from v_countNum where member_id=1
複製代碼

 19:echo count('abc'); 輸出什麼?

解析:

答案:1
count — 計算數組中的單元數目或對象中的屬性個數
int count ( mixed$var [, int $mode ] ), 若是 var 不是數組類型或者實現了 Countable 接口的對象,將返回1,有一個例外,若是 varNULL 則結果是 0。
對於對象,若是安裝了 SPL,能夠經過實現 Countable 接口來調用 count()。該接口只有一個方法 count(),此方法返回 count() 函數的返回值。

20:php class中static,public,private,protected的區別?
解析:

static 靜態,類名能夠訪問
public 表示全局,類內部外部子類均可以訪問;
private表示私有的,只有本類內部可使用;
protected表示受保護的,只有本類或子類或父類中能夠訪問;

21:HTTP協議中GET、POST和HEAD的區別?

解析:

複製代碼
HEAD: 只請求頁面的首部。

GET: 請求指定的頁面信息,並返回實體主體。

POST: 請求服務器接受所指定的文檔做爲對所標識的URI的新的從屬實體。

(1)HTTP 定義了與服務器交互的不一樣方法,最基本的方法是 GET 和 POST。事實上 GET 適用於多數請求,而保留 POST 僅用於更新站點。

(2)在FORM提交的時候,若是不指定Method,則默認爲GET請 求,Form中提交的數據將會附加在url以後,以?分開與url分開。字母數字字符原樣發送,但空格轉換爲「+「號,其它符號轉換爲%XX,其中XX爲 該符號以16進製表示的ASCII(或ISO Latin-1)值。GET請求請提交的數據放置在HTTP請求協議頭中,而POST提交的數據則放在實體數據中;

GET方式提交的數據最多隻能有1024字節,而POST則沒有此限制。

(3)GET 這個是瀏覽器用語向服務器請求最經常使用的方法。POST這個方法也是用來傳送數據的,可是與GET不一樣的是,使用POST的時候,數據不是附在URI後面傳遞的,而是要作爲獨立的行來傳遞,此時還必需要發送一個Content_length標題,以標明數據長度,隨後一個空白行,而後就是實際傳送的數據。網頁的表單一般是用POST來傳送的。
複製代碼

 22: 語句 include 和 require 都能把另一個文件包含到當前文件中,它們的區別是____;爲了不屢次包含同一文件,能夠用語句____來代替它們?

解析:在如何處理失敗時,include() 產生一個警告而 require() 則致使一個致命錯誤;require_once()/include_once()

23:寫一個函數,可以遍歷一個文件夾下的全部文件和子文件夾。

解析:別人寫的代碼,已經足夠簡潔和給力了。

複製代碼
<?php  
function my_scandir($dir)  
{  
    $files=array();  
    if(is_dir($dir))  
    {  
        if($handle=opendir($dir))  
        {  
            while(($file=readdir($handle))!==false)  
            {  
                if($file!="."&& $file!="..")  
                {  
                    if(is_dir($dir."/".$file))  
                    {  
                        $files[$file]=my_scandir($dir."/".$file);  
                    }  
                    else  
                    {  
                        $files[]=$dir."/".$file;  
                    }  
                }  
            }  
            closedir($handle);  
            return $files;  
        }  
    }  
}  
echo "<pre>";  
print_r(my_scandir("D:\DouJia-3.5"));  
?>  
複製代碼
相關文章
相關標籤/搜索