首頁  >  文章  >  後端開發  >  歸納整理39道PHP面試題(總結分享)

歸納整理39道PHP面試題(總結分享)

WBOY
WBOY轉載
2022-03-23 19:27:248686瀏覽

這篇文章為大家帶來了關於PHP的相關知識,其中主要介紹了PHP面試題,總結了三十九個常見的面試題,php面試題的題型很多,但都離不開PHP面試題基礎常見的,希望對大家有幫助。

歸納整理39道PHP面試題(總結分享)

推薦學習:《PHP教學

PHP常見面試題

1.詳述一次完整的HTTP請求過程

這個問題的核心是網域解析和伺服器(nginx)解析這兩部分,基本上這兩部分詳細闡述就可以了。

步驟一、解析URL

瀏覽器會解析目前的URL數據,判斷此URL是否為合法的連結。如果是合法連結則正常的向下一步驟前進。如果不是合法的鏈接,則會執行搜尋功能,例如執行百度、360、Google搜尋等。

步驟二、解析網域名稱

伺服器是以ip的形式存在的。而網域需要解析到ip上,解析IP會有三個小的步驟:

1)、從瀏覽器本身的快取解析此網域資料

2)、從本機的HOST檔案中解析網域名稱

3)、透過DNS伺服器解析網域

步驟三、拿資訊

這個步驟我們拿到了URL的信息,主要是IP和端口資訊.

步驟四、封包並進行三次握手

瀏覽器將請求資訊打包,透過TCP的三次握手將資料傳遞至伺服器。

步驟五、伺服器解析、處理、回傳資料

伺服器透過種種層級、方式拿到傳遞的數據,對資料進行分析、處理,最後回傳回應類MIME型資料。正常狀態碼為200,非正常的錯誤碼有404、500、501等

步驟六、瀏覽器取得、渲染、展現資料

瀏覽器從伺服器拿到資料、透過載入資源、渲染頁面等操作,將頁面展現給使用者。

2. SESSION 與COOKIE的區別是什麼,請從協議,產生的原因與作用說明?

1)、http無狀態協議,不能區分用戶是否是從同一個網站上來的,同一個使用者請求不同的頁面不能看做是同一個使用者。

2)、SESSION儲存在伺服器端,COOKIE保存在客戶端。 Session比較安全,cookie用某些手段可以修改,不安全。 Session依賴cookie進行傳遞。

停用cookie後,session無法正常使用。 Session的缺點:保存在伺服器端,每次讀取都從伺服器讀取,對伺服器有資源消耗。 Session保存在伺服器端的檔案或資料庫中,預設保存在檔案中,檔案路徑由php設定檔的session.save_path指定。 Session文件是公有的。

3.HTTP 狀態中302、403、 500程式碼意義?

一二三四五原則: 一.訊息系列二成功系列三.重定向系列四. 請求錯誤系列五. 伺服器端錯誤系列

#302:暫時轉移成功,請求的內容已轉移到新位置403:禁止存取500:伺服器內部錯誤401代表未授權。

4. Linux 下建立壓縮包,解壓縮包的命令

Tar.gz:

打包: tar czf file.tar.gz file.txt

解壓縮: tar xzf file.tar.gz

Bz2:

.com: bzip2 [-k] 檔案

# 解壓縮: bunzip2 [ -k] 文件

Gzip(只對文件,不保留原始文件)

打包: gzip file1.txt

解壓縮: gunzip file1.txt.gz

Zip: -r 對目錄

打包: zip file1.zip file1.txt

解壓縮: unzip file1.zip

5. 請寫出資料類型(int char varchar datetime text)的意思;請問 varchar 和 char有什麼不同?

Int 整數 char 定長字元 Varchar 變長字元 Datetime 日期時間型 Text 文字型 Varchar 與char的區別 char是固定長度的字元類型,分配多少空間,就佔用多長空間。 Varchar是可變長度的字元類型,內容有多大就佔用多大的空間,能有效節省空間。由於varchar類型是可變的,所以在資料長度改變的時,伺服器要進行額外的操作,所以效率比char類型低。

6. MyISAM 和 InnoDB 的基本差異?索引結構如何實作?

MyISAM類型不支援事務,表鎖,易產生碎片,要經常優化,讀寫速度較快,而InnoDB類型支援事務,行鎖,有崩潰復原能力。讀寫速度比MyISAM慢。

建立索引:alert table tablename add index (`欄位名稱`)

7. 不使用cookie傳送一個cookie.

理解:session_start()開啟時,產生一個常數SID,當COOKIE開啟時,這個常數為空,當COOKIE關閉時,這個常數中儲存了PHPSESSID的值。透過在URL後面加上一個SID參數來傳遞SESSIONID的值,從而讓客戶端頁面可以使用SESSION裡面的值。當客戶端開啟COOKIE和伺服器端開啟SESSION。瀏覽器第一次請求,伺服器會傳送一個COOKIE給瀏覽器端儲存SESSIONID. 當瀏覽器第二次請求時,會把已存在

8. isset() 和empty( ) 區別

Isset判斷變數是否存在,可以傳入多個變量,若其中一個變數不存在則返回假,empty判斷變數是否為空為假,只可傳一個變量,如果為空為假則回傳真。

9.持久化redis有幾種方式?

答案:主要有兩種方式:

1) 快照持久化

在redis設定檔中已經自動開啟了,

格式為:save N M

表示在N秒之內,redis至少發生M次修改則redis抓快照到磁碟。

當然我們也可以手動執行save或bgsave(非同步)指令來做快照

2)append only file  AOF持久化

 總共有三種模式,例如

appendfsync everysec預設的是每秒強制寫入磁碟一次

appendfsync always 每次執行寫入作業的時候就強制寫入磁碟

appendfsync no 完全取決於os,效能最好但是持久化沒辦法保證

其中第三種模式最好。 redis預設的也是採取第三種模式。

10.mysql儲存引擎

答案:常用的主要分為兩種,一種是innodb,一種是myisam,兩者的主要差異是

1)myisam不支援事務處理,而innoDB支援事務處理

2)myisam 不支援外鍵,innoDB支援外鍵

3)myisam支援全文檢索,而innoDB在MySQL5.6版本之後才支援全文檢索

4)資料的儲存形式不一樣,mysiam表存放在三個文件:結構、索引、數據,innoDB儲存把結構儲存為一個文件,索引和資料儲存為一個檔案

5)myisam在查詢和增加資料效能更優於innoDB,innoDB在批次刪除方面效能較高。

6)myisam支援表鎖,而innoDB支援行鎖

#11.sql注入是什麼及如何預防sql注入?

答:SQL注入攻擊指的是使用者或駭客透過建構特殊的輸入作為參數傳入我們的Web應用程式端,而這些輸入大都是SQL語法裡的一些組合,透過執行SQL語句進而執行攻擊者所要的操作,其主要原因是程式設計師沒有細緻地過濾使用者輸入的數據,致使非法資料侵入系統而造成的。因此我們在做開發過程中一定要預防sql注入,主要從兩方面著手:

1)佔位符的方式,就是對sql語句進行預處理,然後執行sql語句

2)透過addslashes或mysql_real_escape_string這兩個函數對使用者輸入的值進行轉義處理,把一些特殊的字元轉義掉。

12.有用過預處理麼?

答:用過,PDO類別中,有個prepare方法可以實現預處理,PDOStament類別中的excute方法可以執行預處理,預處理的參數分為兩種,一種是:字串佔位符,另一種是?佔位符,:字串佔位符在執行預處理傳遞參數時傳入的是關聯數組,而?佔位符傳遞的是索引數組。兩者不能混合使用,但一般建議使用:字串佔位符。

13.用框架還用自己的處理嗎

#######答:一般成熟的開源框架中都考慮到了資料安全這方面的東西,但有時候我們可能會使用一些原生的SQL語句時,我們就需要考慮自己對sql語句進行預處理。當然有時框架中的過濾方法我們不希望採用,例如使用文字編輯器時,我們可以使用自己的過濾方式。 ###

14.mysql優化怎麼做的?

答案:mysql最佳化主要從以下幾個面向來實現:

  1)設計角度:儲存引擎的選擇,欄位類型選擇,範式

  2 )功能角度:可以利用mysql本身的特性,如索引,查詢緩存,碎片整理,分區、分錶等

  3)sql語句的優化方面:盡量簡化查詢語句,能查詢字段少就盡量少查詢字段,優化分頁語句、分組語句等。

  4)部署大負載架構系統:資料庫伺服器單獨出來,負載大時可以採用主從複製,讀寫分離機制進行設計

  5)從硬體上升級資料庫伺服器。

15.請說明 PHP 中傳值與傳引用的差異。什麼時候傳值什麼時候傳引用?

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

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

優缺點:按值傳遞時,php必須複製值。特別是對於大型的字串和物件來說,這將會是一個代價很大的操作。按引用傳遞則不需要複製值,對於效能提升很有好處。

16.在PHP中error_reporting這個函數有什麼作用?

設定 PHP 的報錯等級並傳回目前等級。

17.使用PHP描述快速排序演算法,物件可以是一個陣列嗎?

原理:快速排序使用分治策略來把待排序資料序列分為兩個子序列,具體步驟為:

(1)從數列中挑出一個元素,稱該元素為「基準」。

(2)掃描一遍數列,將所有比「基準」小的元素排在基準前面,所有比「基準」大的元素排在基準後面。

(3)經過遞歸,將各子序列分割成更小的序列,直到小於基準值元素的子數列和大於基準值元素的子數列排序。

//快速排序(数组排序)
function QuickSort($arr){
 $num = count($arr);
 $l=$r=0;
 for($i=1;$i<$num;$i++){
  if($arr[$i] < $arr[0]){
   $left[] = $arr[$i];
   $l++;
  }else{
   $right[] = $arr[$i];
   $r++;
  }
 }
 if($l > 1){
  $left = QuickSort($left);
 }
 $new_arr = $left;
 $new_arr[] = $arr[0];
 if($r > 1){
  $right = QuickSort($right);
 }
 for($i=0;$i<$r;$i++){
  $new_arr[] = $right[$i];
 }
 return $new_arr;
}

18.使用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;
 }
}

19.寫一個二維數組排序演算法函數,能夠具有通用性,可以呼叫php內建函數(array_multisort())

//二维数组排序, $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;
}

20.對於使用者輸入一串字串$string,要求$string中只能包含大於0的數字和英文逗號,請用正規表示式驗證,對於不符合要求的$string傳回出錯訊息

class regx { 
 public static function check($str) { 
 if(preg_match("/^([1-9,])+$/",$str)) { 
  return true; 
 } 
 return false; 
 } 
} 
$str="12345,6"; 
if(regx::check($str)) { 
echo "suc"; 
} else { 
echo "fail"; 
}

# 21.單例模式,建立mysqli資料庫連結的單例物件

class Db { 
 private static $instance; 
 public $handle; 
 Private function __construct($host,$username,$password,$dbname) { 
  $this->handle=NULL; 
  $this->getcon($host,$username,$password,$dbname); 
 } 
 public static function getBb() { 
  self::$instance=new Db(); 
  return self::$instance; 
 } 
 private function getcon($host,$username,$password,$dbname) { 
  if($this->handle!=NULL){ 
   return true; 
  } 
  $this->handle=mysqli_connect($host,$username,$password,$dbname); 
 } 
}

#22.PHP session擴充預設將session資料儲存在哪裡?D

#A ) SQLite Database

B) MySQL Database

C) Shared Memory

D) File System

E) Session Server

23.PHP的strtolower()和strtoupper()函數在安裝非中文系統的伺服器下可能會導致將漢字轉換為亂碼,請寫兩個替代的函數實作相容Unicode文字的字符字串大小寫轉換

答:原因是:中文是由多字節組成的,而只有英文系統的單一英文字元只有一個字節,所以該系統把中文的每一個字節都做了strtolower()處理,改變後的中文字節拼接在一起就成了亂碼(新生成的編碼映射對應的字符可能就不是中文了)

手動解決:用str_split(string string ,intstring,intsplit_length = 1)以每個位元組切割,像中文能切割成三個位元組。將辨識到的位元組若是英文字母則進行轉換。

<?php  
function mystrtoupper($a){  
    $b = str_split($a, 1);  
    $r = &#39;&#39;;  
    foreach($b as $v){  
        $v = ord($v);  
        if($v >= 97 && $v<= 122){  
            $v -= 32;  
        }  
        $r .= chr($v);  
    }  
    return $r;  
}  
 
 
$a = &#39;a中你继续F@#$%^&*(BMDJFDoalsdkfjasl&#39;;  
echo &#39;origin string:&#39;.$a."\n";  
echo &#39;result string:&#39;;  
$r = mystrtoupper($a);  
var_dump($r);

24.PHP的is_writeable()函數存在Bug,無法準確判斷一個目錄/檔案是否可寫,請寫一個函數來判斷目錄/檔案是否絕對可寫

#答案:其中bug有兩個方面, 
1)在windowns中,當檔案只有唯讀屬性時,is_writeable()函數才會傳回false,當傳回true時,該檔案不一定是可寫的。 
如果是目錄,在目錄中新建文件並透過開啟文件來判斷; 
如果是文件,可以透過開啟檔案(fopen),來測試文件是否可寫入。

2)在Unix中,當php設定檔中開啟safe_mode時(safe_mode=on),is_writeable()同樣不可用。 
讀取設定檔是否safe_mode是否開啟。

/**
* Tests for file writability
*
* is_writable() returns TRUE on Windows servers when you really can&#39;t write to
* the file, based on the read-only attribute. is_writable() is also unreliable
* on Unix servers if safe_mode is on.
*
* @access   private
* @return   void
*/
if ( ! function_exists(&#39;is_really_writable&#39;))
{
    function is_really_writable($file)
    {
    // If we&#39;re on a Unix server with safe_mode off we call is_writable
    if (DIRECTORY_SEPARATOR == &#39;/&#39; AND @ini_get("safe_mode") == FALSE)
    {
        return is_writable($file);
    }
 
    // For windows servers and safe_mode "on" installations we&#39;ll actually
    // write a file then read it. Bah...
    if (is_dir($file))
    {
        $file = rtrim($file, &#39;/&#39;).&#39;/&#39;.md5(mt_rand(1,100).mt_rand(1,100));
 
        if (($fp = @fopen($file, FOPEN_WRITE_CREATE)) === FALSE)
        {
            return FALSE;
        }
 
        fclose($fp);
        @chmod($file, DIR_WRITE_MODE);
        @unlink($file);
        return TRUE;
    } elseif ( ! is_file($file) OR ($fp = @fopen($file, FOPEN_WRITE_CREATE)) === FALSE) {
        return FALSE;
    }
 
    fclose($fp);
    return TRUE;
    }
}

25.PHP处理上传文件信息数组中的文件类型$_FILES[‘type’]由客户端浏览器提供,有可能是黑客伪造的信息,请写一个函数来确保用户上传的图像文件类型真实可靠

答:用getimagesize来判断上传图片的类型比$_FILES函数的type更可靠
同一个文件,使用不同的浏览器php返回的type类型是不一样的,由浏览器提供type类型的话,
就有可能被黑客利用向服务器提交一个伪装撑图片后缀的可执行文件。
可以通过getimagesize()函数来判断上传的文件类型,如果是头像文件 会返回这样的一个数组

Array
(
    [0] => 331
    [1] => 234
    [2] => 3
    [3] => width="331" height="234"
    [bits] => 8
    [mime] => image/png
);

26.如何实现PHP的安全最大化?怎样避免SQL注入漏洞和XSS跨站脚本攻击漏洞?

答:基本原则:不对外界展示服务器或程序设计细节(屏蔽错误),不相信任何用户提交的数据(过滤用户提交) 

1)屏蔽错误,将display_errors 设置为off 
2)过滤用户提交参数,这里需要注意的是不能仅仅通过浏览器端的验证,还需要经过服务器端的过滤

这里是需要注意最多的地方,因为所有用户提交的数据入口都在这里,这是过滤数据的第一步。
      1 考虑是否过滤select,insert,update,delete,drop,create等直接操作数据的命令语句
      2 使用addslashes 将所有特殊字符过滤
      3 打开magic_quotes_gpc,开启该参数数后自动将sql语句转换,将 ' 转换成  \'

3)可以考虑设置统一入口,只允许用户通过指定的入口访问,不能访问未经许可的文件等内容 
4)可以考虑对安全性要求高的文件进行来源验证,比如要想执行b.php必须先执行a.php,可以在b.php中判断来自a.php的referer,避免用户直接执行b.php

27.请写出让PHP能够在命令行下以脚本方式执行时安装PHP所必须指定的configure参数,并说明如何在命令行下运行PHP脚本(写出两种方式)同时向PHP脚本传递参数?

答:由于 –enable-cli 和 –enable-cgi 同时默认有效,因此,不必再配置行中加上 –enable-cli 来使得 CLI 在 make install 过程中被拷贝到 {PREFIX}/bin/php

php -f “index.php” 
php -r “print_r(get_defined_constants());”

28.PHP的垃圾收集机制是怎样的?

说明: 
1)如果,你熟悉PHP源码,那么请从源码入手,回答些问题,会获得额外加分 
2)如果,你不熟悉PHP源码,那么尽你所能,多写点东西,包括利用自己的编程直觉得到的信息,都可以。 
3)对,则有分,错误不扣,不写无分。

答:PHP可以自动进行内存管理,清除不再需要的对象。PHP使用了引用计数(referencecounting)这种单纯的垃圾回收(garbagecollection)机制。每个对象都内含一个引用计数器,每个reference连接到对象,计数器加1。当reference离开生存空间或被设为NULL,计数器减1。当某个对象的引用计数器为零时,PHP知道你将不再需要使用这个对象,释放其所占的内存空间。

29.get和post的区别?

1. get是从服务器上获取数据,post是向服务器传送数据。
2. get是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看到。post是通过HTTP post机制,将表单内各个字段与其内容放置在HTML HEADER内一起传送到ACTION属性所指的URL地址。用户看不到这个过程。
3. get传送的数据量较小,不能大于2KB。post传送的数据量较大,一般被默认为不受限制。
4. get安全性非常低,post安全性较高。但是执行效率却比Post方法好。

30.如何修改会话的生存时间?

一:在php.ini中设置session.gc_maxlifetime = 1440 //默认时间
二:代码实现      $ lifeTime = 24 * 3600; //保存一天
    session_set_cookie_params($ lifeTime); 
    在session_start();

31.微信支付回调失败该如何处理?

他问的是已经支付成功后,但是回调失败了。

自己可以创建定时任务在每天的凌晨执行,去微信那边对账,然后更新数据库订单状态。

32.调用区块链接口的安全措施,有那些实现方法?

来自PHP技术交流群 群友分享

  1. 使用MD5实现对接口加签,目的是为了防止篡改数据。
  2. 基于网关实现黑明单与白名单拦截
  3. 可以使用rsa非对称加密 公钥和私钥互换
  4. 如果是开放接口的话,可以采用oath2.0协议
  5. 使用Https协议加密传输,但是传输速度慢
  6. 对一些特殊字符实现过滤 防止xss、sql注入的攻击
  7. 定期使用第三方安全扫描插件
  8. 接口采用dto、do实现参数转化 ,达到敏感信息脱敏效果
  9. 使用token+图形验证码方法实现防止模拟请求
  10. 使用对ip访问实现接口的限流,对短时间内同一个请求(ip)一直访问接口 进行限制。

33.服务器受到dos攻击,这个问题如何应付?

看看你的服务的访问日志,在防火墙中加过滤,或者在web服务器中加过滤吧。方法有以下几种。

  • 对于特定的IP访问的情况,限制IP访问
  • 限制同一IP在单位时间内的访问次数
  • 上级服务器,提高吞吐能力

是消耗服务器资源为主还是纯流量攻击?消耗资源的可以通过配置防火墙过滤规则防御中小规模的攻击。如果是纯流量攻击,考虑你用的是linode真心无解。即便你封了IP封了端口也没用,人家不管你接不接受他的请求,他都会塞满你的带宽。linode必然认为你是被流量攻击或者消耗过多资源然后给你挂起。

34.简述Linux下安装Mysql的过程?

Groupadd mysql 添加一个用户组mysql
Useradd -g mysql mysql 添加一个mysql用户指定分组为mysql
Cd /lamp/mysql 进入mysql目录
./configure –prefix=/usr/local/mysql/ –with-extra-charsets=all
Make
Make all

35.对于大流量的网站,您采用什么样的方法来解决访问量问题?

优化程序,优化数据库,如果程序和数据库已经最优化,使用以下解决方法:

  • 确定当前服务器设备是否满足流量需求。
  • 使用Memcache缓存技术,把动态内容缓存到文件中,动态网页直接调用这些文件,而不必再访问数据库。
  • 禁止外部盗链,图片和文件外部盗链会给服务器带来大量的负载压力,可以通过refer来禁止外部盗链,或者使用apache来配置禁止盗链。
  • 控制大文件的下载,大文件的下载对于非SCSI硬盘来说会占用大量的资源,导致服务器的响应能力下降。
  • 使用不同的主机分流主要流量,使服务器均衡负载。
  • 使用流量统计软件统计分析网站流量,可以知道哪些地方耗费了大量的流量,哪些页面需要再进行优化。

36.对关系型数据库而言,索引是相当重要的概念,请回答有关索引几个问题:

1)索引的目的是什么?

  • 快速访问数据表中的特定信息,提高检索速度
  • 创建唯一性索引,保证数据库表中每一行数据的唯一性
  • 加速表和表之间的连接
  • 使用分组和排序子句进行数据检索时,可以显著减少查询中分组和排序的时间

2) 索引对数据库系统的负面影响是什么?

负面影响:创建索引和维护索引需要耗费时间,这个时间随着数据量的增加而增加;索引需要占用物理空间,不光是表需要占用数据空间,每个索引也需要占用物理空间;当对表进行增、删、改的时候索引也要动态维护,这样就降低了数据的维护速度。

3) 为数据表建立索引的原则有哪些?

  • 在最频繁使用的、用以缩小查询范围的字段上建立索引
  • 在平频繁使用的、需要排序的字段上建立索引

4) 什么情况下不宜建立索引?

  • 对于查询中很少涉及的列或者重复值比较多的列,不宜建立索引
  • 对于一些特殊的数据类型,不宜建立索引,比如文本字段(text),值范围较少的知道等。

37.PHP字符串中单引号与双引号的区别?

单引号不能解释变量,而双引号可以解释变量。

单引号不能转义字符,在双引号中可以转义字符。

38.求两个日期的差数,例如2021-2-5 ~ 2021-3-6 的日期差数

方法一:
<?php
class Dtime{
 function get_days($date1, $date2){
  $time1 = strtotime($date1);
  $time2 = strtotime($date2);
  return ($time2-$time1)/86400;
 }
}
$Dtime = new Dtime;
echo $Dtime->get_days(’2021-2-5′, ’2021-3-6′);
?>
方法二:
<?php
$temp = explode(‘-’, ’2021-2-5′);
$time1 = mktime(0, 0, 0, $temp[1], $temp[2], $temp[0]);
$temp = explode(‘-’, ’2021-3-6′);
$time2 = mktime(0, 0, 0, $temp[1], $temp[2], $temp[0]);
echo ($time2-$time1)/86400;
方法三:echo abs(strtotime(“2021-2-5″)-strtotime(“2021-3-1″))/60/60/24 计算时间差

39.有一个一维数组,里面存储整形数据,请写一个函数,将他们按从大到小的顺序排列。要求执行效率高。并说明如何改善执行效率。(该函数必须自己实现,不能使用php函数)

<?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);

推荐学习:《PHP视频教程

以上是歸納整理39道PHP面試題(總結分享)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:csdn.net。如有侵權,請聯絡admin@php.cn刪除