1. 程式人生 > 實用技巧 >30道2020年騰訊PHP面試題整理(附帶答案)

30道2020年騰訊PHP面試題整理(附帶答案)

PHP開發工程師筆試試卷

姓名:***

一、PHP開發部分

1.合併兩個陣列有幾種方式,試比較它們的異同

答:

1)array_merge()

2)’+’

3)array_merge_recursive

array_merge 簡單的合併陣列

array_merge_recursive 合併兩個陣列,如果陣列中有完全一樣的資料,將它們遞迴合併

array_combine 和 ‘+’ :合併兩個陣列,前者的值作為新陣列的鍵

2.請寫一個函式來檢查使用者提交的資料是否為整數(不區分資料型別,可以為二進位制、八進位制、十進位制、十六進位制數字)

答:其實主要還是is_int和 floor 這個方法

if(!is_numeric($jp_total)||strpos($jp_total,".")!==false){ 
    echo "不是整數"; 
}else{ 
    echo "是整數"; 
}

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

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

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

<?php
function mystrtoupper($a){ 
    $b = str_split($a, 1); 
    $r = ''; 
    foreach($b as $v){ 
        $v = ord($v); 
        if($v >= 97 && $v<= 122){ 
            $v -= 32; 
        } 
        $r .= chr($v); 
    } 
    return $r; 
} 


$a = 'a中你繼續F@#$%^&*(BMDJFDoalsdkfjasl'; 
echo 'origin string:'.$a."\n"; 
echo 'result string:'; 
$r = mystrtoupper($a); 
var_dump($r);

4.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'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('is_really_writable'))
{
    function is_really_writable($file)
    {
    // If we're on a Unix server with safe_mode off we call is_writable
    if (DIRECTORY_SEPARATOR == '/' AND @ini_get("safe_mode") == FALSE)
    {
        return is_writable($file);
    }

    // For windows servers and safe_mode "on" installations we'll actually
    // write a file then read it. Bah...
    if (is_dir($file))
    {
        $file = rtrim($file, '/').'/'.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;
    }
}

5.PHP的chmod()函式存在Bug,無法保證設定成功,請寫一個函式在指定路徑下建立一個目錄/檔案並確保可以正確設定許可權掩碼

答:我也找不到答案

6.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
);

如果通過getimagesize()函式返回的是這樣的一個數組 說明上傳的是頭像檔案。其中索引為2的表示型別

1 = GIF,2 = JPG,3 = PNG,4 = SWF,5 = PSD,6 = BMP,7 = TIFF(intel byte

order),8 = TIFF(motorola byte order),9 = JPC,10 = JP2,11 = JPX,12 =

JB2,13 = SWC,14 = IFF,15 = WBMP,16 = XBM,

你可以通過這個再去限制上傳的頭像型別

<?php
    $file=$_FILES['file'];
    if(!empty($file))
    {
        var_dump($file);
        var_dump(getimagesize($file["tmp_name"]));
    }  
?>

7.PHP通過對資料的URL編碼來實現與Javascript的資料互動,但是對於部分特殊字元的編解碼與Javascript的規則不盡相同,請具體說明這種差異,並針對UTF-8字符集的資料,寫出PHP的編解碼函式和Javascript的編解碼函式,確保PHP編碼資料可以被Javascript正確解碼 、Javascript編碼的資料可以被PHP正確解碼

答:

<?php
 $str = '思源部落格siyuantlw/tlw/sy/俺只是一個打醬油的';
 $str = iconv("GB2312",'UTF-8',$str);
 $str = urlencode($str);
?>
//js  decodeURIComponent   貌似對GB2312編碼的格式不識別,必須轉為utf-8才可以,然後,如果字串中有空格的  就轉為 +  號了
<html>
  <script>
    var ds = '<?php echo $str;?>';
    var dddd= decodeURIComponent (ds);
    alert(dddd);
  </script>
</html>

8.試闡述Memcache的key多節點分佈的演算法?當任一節點出現故障時PHP的Memcache客戶端將如何處置?如何確保Memcache資料讀寫操作的原子性?

答:

原理:一致性hash

原子性

原子性會導致的問題:簡單的說就是A,B都想操作key1,然後都在key1上增加自己的資訊,就會有問題

memcached是原子的嗎?

巨集觀

所有的被髮送到memcached的單個命令是完全原子的。如果您針對同一份資料同時傳送了一個set命令和一個get命令,它們不會影響對方。它們將被序列化、先後執行。即使在多執行緒模式,所有的命令都是原子的;命令序列不是原子的。如果您通過get命令獲取了一個item,修改了它,然後想把它set回memcached,我們不保證這個item沒有被其他程序(process,未必是作業系統中的程序)操作過。在併發的情況下,您也可能覆寫了一個被其他程序set的item。

memcached 1.2.5以及更高版本,提供了gets和cas命令,它們可以解決上面的問題。如果您使用gets命令查詢某個key的item,memcached會 給您返回該item當前值的唯一標識。如果您覆寫了這個item並想把它寫回到memcached中,您可以通過cas命令把那個唯一標識一起傳送給 memcached。如果該item存放在memcached中的唯一標識與您提供的一致,您的寫操作將會成功。如果另一個程序在這期間也修改了這個 item,那麼該item存放在memcached中的唯一標識將會改變,您的寫操作就會失敗。

9.如何實現PHP的安全最大化?怎樣避免SQL注入漏洞和XSS跨站指令碼攻擊漏洞?

答:基本原則:不對外界展示伺服器或程式設計細節(遮蔽錯誤),不相信任何使用者提交的資料(過濾使用者提交)

1)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

10.請設計一個數據結構可以實現無限級子選單的樹型選單功能並提供選單生成演算法,用UML描述設計並寫出相關PHP程式碼

答:還沒找到答案

二、系統相關部分

1.請簡述Linux、FreeBSD、Soalaris、Mac OS、Windows幾種系統下程序與執行緒的核心實現方式、管理機制的異同

2.請簡述Linux/BSD系統下程序間通訊的方式有哪些,並具體說明在PHP下如何實現

答:

  • 管道(Pipe)及有名管道(namedpipe):管道可用於具有親緣關係程序間的通訊,有名管道克服了管道沒有名字的限制,因此,除具有管道所具有的功能外,它還允許無親緣關係程序間的通訊;

  • 訊號(Signal):訊號是比較複雜的通訊方式,用於通知接受程序有某種事件發生,除了用於程序間通訊外,程序還可以傳送訊號給程序本身;linux除了支援Unix早期訊號語義函式sigal外,還支援語義符合Posix.1標準的訊號函式sigaction(實際上,該函式是基於BSD的,BSD為了實現可靠訊號機制,又能夠統一對外介面,用sigaction函式重新實現了signal函式);

  • 報文(Message)佇列(訊息佇列):訊息佇列是訊息的連結表,包括Posix訊息佇列systemV訊息佇列。有足夠許可權的程序可以向佇列中新增訊息,被賦予讀許可權的程序則可以讀走佇列中的訊息。訊息佇列克服了訊號承載資訊量少,管道只能承載無格式位元組流以及緩衝區大小受限等缺點。

  • 共享記憶體:使得多個程序可以訪問同一塊記憶體空間,是最快的可用IPC形式。是針對其他通訊機制執行效率較低而設計的。往往與其它通訊機制,如訊號量結合使用,來達到程序間的同步及互斥。

  • 訊號量(semaphore):主要作為程序間以及同一程序不同執行緒之間的同步手段。

  • 套介面(Socket):更為一般的程序間通訊機制,可用於不同機器之間的程序間通訊。起初是由Unix系統的BSD分支開發出來的,但現在一般可以移植到其它類Unix系統上:Linux和SystemV的變種都支援套接字。

3.請簡述Linux/BSD系統下系統的訊息/事件非同步通知機制有幾種,並加以比較

4.簡單比較TCP/UDP協議的異同,對於PHP的Socket擴充套件與Stream擴充套件,試比較兩者基於TCP/UDP協議的SOCKET程式設計差異?

5.為什麼會出現僵死程序(孤兒程序)?怎樣檢視僵死程序?如何解決僵死程序問題?

答:

  • 殭屍程序:一個程序使用fork建立子程序,如果子程序退出,而父程序並沒有呼叫wait或waitpid獲取子程序的狀態資訊,那麼子程序的程序描述符仍然儲存在系統中。這種程序稱之為僵死程序。

  • 檢視:使用ps aux

  • 刪除:ps aux | grep -e ‘^ [Zz]’ | awk ‘{print $2}’ | xargs kill -9

6.對於System-V訊息佇列,如何解決系統本身對於訊息佇列條數、總容量(位元組數)的限制?如何設定訊息的優先級別?請比較阻塞模式和非阻塞模式的異同,並說明如何避免非阻塞模式下的訊息佇列堵塞?

7.請描述Apache 2.x版本的MPM(Multi-Processing Module)機制,並具體說明在不同的MPM機制下如何支援PHP?

答:常用的應該就只有3個:worker、prefork、perchild

  • prefork:在功能上就是使用Apache的執行方式,一個父程序,然後根據設定以及連線情況生成相應的子程序數。這種模式可靠性和健壯性都是最好的。但是在效能上,開銷過大。達不到我們這些“吸血鬼”的要求了_。如果連線數過多的話,會導致我們無法遠端登陸,一定要等到連線數下降後才能連線,這也是最讓我頭痛的事情。

  • worker:混合執行緒/程序的MPM。一個父程序,後面是帶有執行緒的子程序。每個子程序的執行緒數是固定且相同的。這是最“平庸”的一個模式,但也是使用人最多的一種模式。因為它效能等各方面比較均衡。效能上要比prefork好一些,只是犧牲了一點點的健壯性和可靠性而已。一般推薦使用這個選項。

  • perchild:也是混合執行緒/程序的MPM。當啟動perchild MPM時,它會建立指定數量的子程序,且每個子程序都具有指定數量的執行緒,如負載增加了,那它不會建立新的程序(子程序是固定的),只是在子程序下建立新的執行緒。它還有一個特點就是可以為每一個子程序配置不同的使用者和組。也可以為每個虛擬主機指定一個子程序。這種模式效能是最佳的,但是可靠性和健壯性就相對是最差的。各取所需,我個人覺得這種模式也不錯,如果你不用第三方的模組的話_

8.請簡述PHP在Apache下的幾種執行方式並加以比較?如何讓PHP在Linux+Apache下以Fast CGI方式執行?

答:php在apache有3中執行方式:CGI模式、FastCGI模式、Apache 模組DLL。

比較:

  • Cgi模式和模組dll載入方式比較:

Cgi模式下,apache呼叫外部執行器php.exe執行php程式碼,並將解釋後生成的html程式碼和原html整合,再傳遞給apache伺服器,其在執行時每次都需要重新解析php.ini、重新載入全部dll擴充套件並重初始化全部資料結構,執行速度非常慢,但因為是外部載入執行器,php程式碼執行出錯不會導致apache崩潰。

在模組化(DLL)中,PHP是與Web伺服器一起啟動並執行的。所以從某種角度上來說,以apache模組方式安裝的 PHP4有著比CGI模式更好的安全性以及更好的執行效率和速度。

  • Cgi和fastcgi模式比較:

Fastcig是cgi的升級版,Cgi和fastcgi工作模式大抵相同,但fastcgi模式中fastcgi的程序管理器可用來管理cgi直譯器,該管理器在cgi直譯器完成請求後,會處於掛起狀態,用以等待接下來的請求,因為向比較cgi每次都需要重新解析php.ini、重新載入全部dll擴充套件並重初始化全部資料結構,fastcig模式明顯要快很多。

9. 請寫出讓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());”

10.請簡述PHP 5.2的記憶體池及其記憶體管理機制、垃圾回收機制

記憶體管理機制

試題二:

1、請列舉你能想到的UNIX訊號,並說明訊號用途。

答:

  • Unix訊號量也可以在檔案/usr/include/sys/signal.h中檢視

  • SIGHUP 程序由於控制終端死去或者控制終端發出起命令

  • SIGINT 鍵盤中斷所產生的訊號

  • SIGQUIT 鍵盤終止

2、請列舉、你能想到的所有的字串查詢演算法,並加註釋簡單說明。

答:

  • 順序查詢

  • 二分查詢

  • 分塊查詢

  • 雜湊表查詢

3、有一個IP地址(192.168.0.1),請寫出其32位無符號整數形式。

答:此題是將十進位制轉換成二進位制 採用取餘法即可很簡單 答案是:11000000.10101000.00000000.00000001 千萬不能只記答案哦

4、寫出、你能想到的所有HTTP返回狀態值,並說明用途(比如:返回404表示找不到頁面)

答:

200 (成功) 伺服器已成功處理了請求。 通常,這表示伺服器提供了請求的網頁。

301 (永久移動) 請求的網頁已永久移動到新位置。 伺服器返回此響應(對 GET 或 HEAD 請求的響應)時,會自動將請求者轉到新位置。

302 (臨時移動) 伺服器目前從不同位置的網頁響應請求,但請求者應繼續使用原有位置來進行以後的請求。

401 (未授權) 請求要求身份驗證。 對於需要登入的網頁,伺服器可能返回此響應。

403 (禁止) 伺服器拒絕請求。

404 (未找到) 伺服器找不到請求的網頁。

500 (伺服器內部錯誤) 伺服器遇到錯誤,無法完成請求。

501 (尚未實施) 伺服器不具備完成請求的功能。 例如,伺服器無法識別請求方法時可能會返回此程式碼。

502 (錯誤閘道器) 伺服器作為閘道器或代理,從上游伺服器收到無效響應。

503 (服務不可用) 伺服器目前無法使用(由於超載或停機維護)。 通常,這只是暫時狀態。

504 (閘道器超時) 伺服器作為閘道器或代理,但是沒有及時從上游伺服器收到請求。

505 (HTTP 版本不受支援) 伺服器不支援請求中所用的 HTTP 協議版本。

基礎任務-選作(會得到額外分數):

1、畫幾個你最熟悉的SERVER端模型出來(格式不重要,儘量將圖畫清楚,說明思路即可)

進階任務:

1、PHP的垃圾收集機制是怎樣的?

說明:

1)如果,你熟悉PHP原始碼,那麼請從原始碼入手,回答些問題,會獲得額外加分

2)如果,你不熟悉PHP原始碼,那麼盡你所能,多寫點東西,包括利用自己的程式設計直覺得到的資訊,都可以。

3)對,則有分,錯誤不扣,不寫無分。

答:PHP可以自動進行記憶體管理,清除不再需要的物件。PHP使用了引用計數(referencecounting)這種單純的垃圾回收(garbagecollection)機制。每個物件都內含一個引用計數器,每個reference連線到物件,計數器加1。當reference離開生存空間或被設為NULL,計數器減1。當某個物件的引用計數器為零時,PHP知道你將不再需要使用這個物件,釋放其所佔的記憶體空間。

2、請寫出HTTP頭,並符合以下要求:

1)這是一個post請求

2)目標:http://www.example.com:8080/test

3)POST變數:

username: test
pwd: test2
intro: Hello world!

4)包含以下COOKIE資訊:

cur_query: you&me

說明:

1)如果,你記不得某個HTTP協議中的指令字了,那麼,無奈這舉是用“漢字”代替。

2)如果,你能記住更多的HTTP協議指令字,那麼多寫幾句,總是沒壞處,對吧?

3)最關鍵的,只需要畫出正確的“輪廓”(還記得httpwatch等工具打印出來的頭部嗎?那就是“輪廓”的含義),也會有分數,但如果,連“輪廓”都寫錯了,那麼就很遺憾了。

答:

Accept: text/html 可以接受的資料型別
Accept-Encoding: gzip 接受的壓縮型別
Accept-Language: zh-CN 接受語言
Cache-Control: no-cache 是否有快取
Connection : keep-alive 是否保持連結
Host:http://www.example.com:8080/test
Cookie:intro=Hello world!
Content-Disposition: form-data; username=”test”&pwd=”test2”&intro=”hello world!”
User-Agent: 瀏覽器資訊
Referer: 前一個頁面地址

設計任務:

1、最近總有人騷擾我們的投票模組,需要你來設計一個投票限制的東東

要求如下:

1)要求每個QQ號碼(假設此QQ號碼在UNIT32內可以表示)10分鐘這內只能投5票。

2)我們的使用者很踴躍,平均每天要有2000萬人左右通過此程式投票。

說明:

1)無需寫程式碼,只需要圖跟文字即可。

2)對於關鍵邏輯,請用圖加程式碼表示出來,這也是對你文字表達能力的一個考驗。

3)對你能想到的所有的邊界條件列出來,這是對你邏輯思維全面與敏捷性的考驗。

4)儲存部分,盡你所能吧。如果,你需要一個自己設計的儲存層,那麼把這個儲存層的實現,用文字+圖片方式描述清楚,要是設計合理,你會獲得華麗的獎分。

答:找了好久終於找到個大神的回答:打字太累了 就截圖了



程式設計任務:

1、我們碰到了大麻煩,一個新來的傳教士惹惱了上帝,上帝很憤怒,要求我們把聖經(bbe.txt)背熟,直至他說哪個單詞,我們就要飛快的回答出這個單詞在第幾行第幾個單詞位置。聽說你是個優秀的程式設計師,那麼幫助我們完成這個不可能的任務吧。

要求如下:

1)/myworks/example/bbe.txt,98版本英文聖經一本

2)輸入部分要求如下:php ./example.php [單詞]

3)輸出部分如下:[單詞] 1,2 2,4 5,6 表示:此單詞在1行2列(第二個單詞),2行4列…

說明:

1)此文字4MB之巨…

2)單詞的含義:由英文字母(大小寫),數字(0-9)組成的串

3)提供給你的機器OS為ubuntu 9.10,記憶體只有1G,而且,很不幸的,其中700M用來做了別的

4)上機考試不允許上網,但我裝了man文件以及讀取CHM以及PDF的閱讀器,在電腦的桌面的CHM資料夾中,有相應的PHP參考手冊

5)演算法複雜度要求不能大於O(N^2)(就是N的平方)

6)什麼?PHP低效且用起來不順手,好的,你可以用別的語言來實現。但注意:提供給你的機器上只有python 2.4/perl 5.8/gcc[g++] 4.1

答:兩份答案感覺還可以

bbe.txt檔案咱們沒有 想像成是 空格 隔開的算了

hello123 hello tim jason

woaini1 tianjianxiong333 hh aaa

/* 此檔案用於根據bbe.txt檔案對所有單詞建立索引,相當於一次預處理 */  
ini_set('display_errors','on'); 
set_time_limit(0); 
$file = file($src); // 陣列 
foreach($file as $i => &$ls){ 
    $a = explode(" ",$ls); 
    $len = count($a); 
    if ($len > 0){ 
        for($j=0;$i<$len;$j++){ 
            $data = "此單詞".$a[$j]."在".($i+1)."行,".($j+1)."列"; 
            $key = md5(trim(strtolower($a[$j]))); 
            file_put_contents($key,$data); 
        } 
    } 
    //echo $i.". > ".$ls.'<br />'; 
}

example.php:

#!/usr/local/bin/php -q  
<?php
set_time_limit(0);  
$getkey=empty($argv[1]) ? $_REQUEST['k'] : $argv[1]; 
$arr = explode(",",$getkey);   
$len = count($arr); 
if($len > 0){ 
    for($i=0;$i<$len;$i++){ 
        echo getKey($arr[$i])."\n"; 
    } 
} 
functuion getKey($key){ 
    $str = "沒有找到此單詞[".$key."]"; 
    if($key){ 
        $fc = md5($key); 
        $str = file_get_contents($fc)); 
    } 
    return $str; 
} 
?>

別人的方法:

1)使用ascii碼,判斷字元所在範圍

2)只要掃描一遍字元即可,複雜度為O(N)

3)利用了php string{$i} 的特性,取字串內任一字元

4)todo:改為fgetc版本,可以完全不需要使用以上php特性

5)字串匹配演算法:http://wendell07.blog.hexun.com/14112681_d.html,目前看來最快的方法:Sunday,由於本題是單詞匹配,問題更簡單,只要找到頭尾……

$word = $argv[1]; 
$lines = 0; 

$handle = @fopen("bbe.txt", "r"); 
if ($handle) { 
    while (!feof($handle)) { 
        $line = fgets($handle, 4096); 
        $local = local_word($line, $word); 
        $lines++; 
        if( !empty($local) ){ 
            echo "$lines,".implode(' ',$local)."\n"; 
        } 
    } 
    fclose($handle); 
} 

function local_word($line, $word){ 
    $local = array(); 
    $local_length = 1; 
    $word_length = strlen($word); 

    for($i = 0; ( $char = $line{$i} ) !== ''; $i++ ){ 
        // 單詞最後一個字元必定不是符號,且必有一個符號結尾,此計為一個新詞 
        if( !is_symbel( $line{ $i-1 } ) && is_symbel($char) ){ 
            $local_length++; 
        }     

        if( $char === $word[0] && // 如果第一個字元相同 
            is_symbel( $line{ $i-1 } ) && // 且為單詞開始 
            is_symbel( $line{ $i+$word_length }) // 單詞結尾應該為符號 
        ){ 
            // 進入驗證單詞模式,一個一個字元比對 
            for($j = 1; ($w_char = $word{$j}) !== ''; $j++ ){ 
                // 遇到單詞字元不匹配 
                if( $w_char != $line{ $i+$j } ){ 
                    $i += $j; 
                    break; 
                } 
                // 如果單詞比對完全正確 
                if( $j == ($word_length-1) ){ 
                    //echo "$line_length, $word_length\n"; 
                    $local[] = $local_length; 
                } 
            } 
        } 
    } 
    return $local; 
} 

function is_symbel($char){ 
    $asc = ord($char); 
    return !( (48 <= $asc && $asc <= 57) || 
              (65 <= $asc && $asc <= 90) || 
              (97 <= $asc && $asc <= 122) ); 
}

點關注,不迷路

好了各位,以上就是這篇文章的全部內容了,能看到這裡的人呀,都是人才。之前說過,PHP方面的技術點很多,也是因為太多了,實在是寫不過來,寫過來了大家也不會看的太多,所以我這裡把它整理成了PDF和文件,如果有需要的可以

點選進入暗號: PHP+「平臺」


更多學習內容可以訪問【對標大廠】精品PHP架構師教程目錄大全,只要你能看完保證薪資上升一個臺階(持續更新)

以上內容希望幫助到大家,很多PHPer在進階的時候總會遇到一些問題和瓶頸,業務程式碼寫多了沒有方向感,不知道該從那裡入手去提升,對此我整理了一些資料,包括但不限於:分散式架構、高可擴充套件、高效能、高併發、伺服器效能調優、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql優化、shell指令碼、Docker、微服務、Nginx等多個知識點高階進階乾貨需要的可以免費分享給大家,需要的可以加入我的 PHP技術交流群