php面試題2016
1. php面試題誰有啊
1.以下哪一句不會把 John 新增到 users 陣列?
$users[] = 'john';
成功把 John 新增到陣列 users。
array_add($users,』john』);
函式 array_add() 無定義。
array_push($users,『john』);
成功把 John 新增到陣列 users。
$users ||= 'john';
語法錯誤。
2.sort()、assort()、和 ksort() 有什麼分別?它們分別在什麼情況下使用?
sort()
根據陣列中元素的值,以英文字母順序排序,索引鍵會由 0 到 n-1 重新編號。主要是當陣列索引鍵的值無關疼癢時用來把陣列排序。
assort()
PHP 沒有 assort() 函式,所以可能是 asort() 的筆誤。
asort()
與 sort() 一樣把陣列的元素按英文字母順序來排列,不同的是所有索引鍵都獲得保留,特別適合替聯想陣列排序。
ksort()
根據陣列中索引鍵的值,以英文字母順序排序,特別適合用於希望把索引鍵排序的聯想陣列。
3.以下的代碼會產生什麼?為什麼?
$num =10;
function multiply(){
$num =$num *10;
}
multiply();
echo $num;
由於函式 multiply() 沒有指定 $num 為全域變數(例如 global $num 或者 $_GLOBALS['num']),所以 $num 的值是 10。
4. reference 跟一個正規的變數有什麼分別?如何 pass by reference?在什麼情況下我們需要這樣做?
Reference 傳送的是變數的地址而非它的值,所以在函式中改變一個變數的值時,整個應用都見到這個變數的新值。
一個正規變數傳送給函式的是它的值,當函式改變這個變數的值時,只有這個函式才見到新值,應用的其他部分仍然見到舊值。
$myVariable = "its' value";
Myfunction(&$myVariable); // 以 reference 傳送參數以 reference 傳送參數給函式,可以使函式改變了的變數,即使在函式結束後仍然保留新值。
5.些函式可以用來在現正執行的腳本中插入函式庫?
對這道題目不同的理解會有不同的答案,我的第一個想法是插入 PHP 函式庫不外乎 include()、include_once()、require()、require_once(),但細心再想,「函式庫」也應該包括 com 物件和 .net 函式庫,所以我們的答案也要分別包括 com_load 和 dotnet_load,下次有人提起「函式庫」的時候,別忘記這兩個函式。
6.foo() 與 @foo() 有什麼分別?
foo() 會執行這個函式,任何解譯錯誤、語法錯誤、執行錯誤都會在頁面上顯示出來。
@foo() 在執行這個函式時,會隱藏所有上述的錯誤訊息。
很多應用程式都使用 @mysql_connect() 和 @mysql_query 來隱藏 mysql 的錯誤訊息,我認為這是很嚴重的失誤,因為錯誤不該被隱藏,你必須妥善處理它們,可能的話解決它們。
7.你如何替 PHP 的應用程式偵錯?
我並不常這樣做,我曾經試過很多不同的偵錯工具,在 Linux 系統中設定這些工具一點也不容易。不過以下我會介紹一個近來頗受注目的偵錯工具。
PHP - Advanced PHP Debugger 或稱 PHP - APD,第一步是執行以下的指令安裝:
pear install apd安裝後在你的腳本的開頭位置加入以下的語句開始進行偵錯:
apd_set_pprof_trace();執行完畢,打開以下檔案來查閱執行日誌:
apd.mpdir
你也可以使用 pprofp 來格式化日誌。
詳細的資料可以參閱 http://us.php.net/manual/en/ref.apd.php。
8.「===」是什麼?試舉一個「==」是真但「===」是假的例子。
「===」是給既可以送回布爾值「假」,也可以送回一個不是布爾值但卻可以賦與「假」值的函式,strpos() 和 strrpos() 便是其中兩個例子。
問題的第二部份有點困難,想一個「==」是假,但是「===」是真的例子卻很容易,相反的例子卻很少。但我終於找到以下的例子:
if (strpos("abc", "a") == true){ // 這部分永不會被執行,因為 "a" 的位置是 0,換算成布爾值「假」}if (strpos("abc", "a") === true){ // 這部份會被執行,因為「===」保證函式 strpos() 的送回值不會換算成布爾值.}
9.你會如何定義一個沒有成員函式或特性的類別 myclass?
class myclass{}
10.你如何產生一個 myclass 的物件?
$obj = new myclass();
11.在一個類別內如何存取這個類別的特性及變改它的值?
使用語句:$this->propertyName,例如:
class myclass{ private $propertyName; public function __construct() { $this->propertyName = "value"; }}
12.include 和 include_once 有什麼分別?require 又如何?
三者都是用來在腳本中插入其他檔案,視乎 url_allow_fopen 是否核准,這個檔案可以從系統內部或外部取得。但他們之間也有微細的分別:
include():這個函式容許你在腳本中把同一個檔案插入多次,若果檔案不存在,它會發出系統警告並繼續執行腳本。
include_once():它跟 include() 的功能相似,正如它的名字所示,在腳本的執行期間,有關檔案只會被插入一次。
require():跟 include() 差不多,它也是用來在腳本中插入其他檔案,但若果檔案不存在,它會發出系統警告,這個警告會引致致命錯誤令腳本中止執行
13.以下哪一個函式可以把瀏覽器轉向到另一個頁面?
redir()
這不是一個 PHP 函式,會引致執行錯誤。
header()
這個是正確答案,header() 用來插入卷頭資料,可以用來使瀏覽器轉向到另一個頁面,例如:
header("Location: http://www.search-this.com/");
location()
這不是一個 PHP 函式,會引致執行錯誤。
redirect()
這不是一個 PHP 函式,會引致執行錯誤。
14.以下哪一個函式可以用來開啟檔案以便讀/寫?
fget()
這不是一個 PHP 函式,會引致執行錯誤。
file_open()
這不是一個 PHP 函式,會引致執行錯誤。
fopen()
這是正確答案,fopen() 可以用來開啟檔案以便讀/寫,事實上這個函式還有很多選項,詳細資料請參閱 php.net。
open_file()
這不是一個 PHP 函式,會引致執行錯誤。
15.mysql_fetch_row() 和 mysql_fetch_array() 有什麼分別?
mysql_fetch_row() 把資料庫的一列儲存在一個以零為基數的陣列中,第一欄在陣列的索引 0,第二欄在索引 1,如此類推。mysql_fetch_assoc() 把資料庫的一列儲存在一個關聯陣列中,陣列的索引就是欄位名稱,例如我的資料庫查詢送回「first_name」、「last_name」、 「email」三個欄位,陣列的索引便是「first_name」、「last_name」和「email」。mysql_fetch_array() 可以同時送回 mysql_fetch_row() 和 mysql_fetch_assoc() 的值。
16.下面的代碼用來做什麼?請解釋。
$date='08/26/2003';print ereg_replace("([0-9]+)/([0-9]+)/([0-9]+)","[url=file://2///1///3%22,$date]\\2/\\1/\\3",$date[/url]);
這是把一個日期從 MM/DD/YYYY 的格式轉為 DD/MM/YYYY 格式。我的一個好朋友告訴我可以把這個正規表達式拆解為以下的語句,對於如此簡單的表示是來說其實無須拆解,純粹為了解說的方便:
// 對應一個或更多 0-9,後面緊隨一個斜號$regExpression = "([0-9]+)/";// 應一個或更多 0-9,後面緊隨另一個斜號$regExpression .= "([0-9]+)/";// 再次對應一個或更多 0-9$regExpression .= "([0-9]+)";至於 [url=file://2///1///3]\\2/\\1/\\3[/url] 則是用來對應括弧,第一個括弧對的是月份,第二個括弧對應的是日期,第三個括弧對應的是年份。
17.給你一行文字 $string,你會如何編寫一個正規表達式,把 $string 內的 HTML 標簽除去?
首先,PHP 有內建函式 strip_tags() 除去 HTML 標簽,為何要自行編寫正規表達式?好了,便當作是面試的一道考題吧,我會這樣回答:
$stringOfText = "<p>This is a test</p>";$expression = "/<(.*?)>(.*?)<\/(.*?)>/";echo preg_replace($expression, "[url=file://2/]\\2[/url]", $stringOfText);// 有人說也可以使用 /(<[^>]*>)/ $expression = "/(<[^>]*>)/";echo preg_replace($expression, "", $stringOfText);
18.PHP 和 Perl 分辨陣列和散列表的方法有什麼差異?
這正是為何我老是告訴別人選擇適當的編程語言,若果你只用一種語言的話你怎麼能回答這道問題?這道問題很簡單,Perl 所有陣列變數都是以 @ 開頭,例如 @myArray,PHP 則沿用 $ 作為所有變數的開頭,例如 $myArray。
至於 Perl 表示散列表則用 %,例如 %myHash,PHP 則沒有分別,仍是使用 $,例如 $myHash。
19.你如何利用 PHP 解決 HTTP 的無狀態本質?
最主要的倆各選擇是 session 和 cookie。使用 session 的方法是在每一頁的開始加上 session_start(),然後利用 $_SESSION 散列表來儲存 session 變數。至於 cookie 你只需記著一個原則:在輸出任何文字之前調用 set_cookie() 函式,此外只需使用 $_COOKIE 散列表便可以存取所有 cookie 變數。
還有一個不那麼可靠的方法,就是利用訪客的 IP 地址,這個方法有特定的危險性。
20.GD 函式庫用來做什麼?
這個可能是我最喜歡的函式庫,自從 PHP 4.3.0 版本後 GD 便內建在 PHP 系統中。這個函式庫讓你處理和顯示各式格式的圖檔,它的另一個常見用途是製作所圖檔。GD 以外的另一個選擇是 ImageMagick,但這個函式庫並不內建於 PHP 之中,必須由系統管理員安裝在伺服器上。
21.試寫出幾個輸出一段 HTML 代碼的方法。
嗯,你可以使用 PHP 中任何一種輸出語句,包括 echo、print、printf,大部分人都使用如下例的 echo:
echo "My string $variable";你也可以使用這種方法:
echo <<<ENDThis text is written to the screen as output and this $variable is parsed too. If you wanted you can have <span> HTML tags in here as well.</span> The END; remarks must be on a line of its own, and can't contain any extra white space.END;
22.PHP 比 Perl 好嗎?請討論。
我們不要為一個簡單的問題引發一場舌戰,正如我經常說的:「為工作選擇適合的語言,不要把工作遷就語言。」我個人認為 Perl 十分適合用作命令行工具,雖然它在網頁應用上也有不錯的表現,但是它的真正實力在命令行上才能充分發揮。同樣地,PHP 雖然可以在控制台的環境中使用,但是個人認為它在網頁應用上有更好的表現,PHP 有大量專門為網頁應用而設計的函式,Perl 則似乎以命令行為設計之本。
個人來說兩種語言我都喜歡,在大學期間我經常使用 Perl、PHP 和 Java,可惜工作上我使用 C#,但在家裡我花不少時間操練 PHP、Perl、Ruby(現正學習)和 Java,保持我的技能知識在最新狀態。很多人問我 C 和 C++ 怎麼樣,它們是否仍有機會在我的應用中佔一席位,我的答案基本上是「否」,我近來的工作主要集中在網頁開發,雖然 C 和 C++ 也可以用來寫網頁,但它們到底不是為這種工作而設計的,「為工作選擇適合的語言」,若果我需要編寫一個控制台應用,用來展示 bubble sort、quick sort 和 merge sort 的效能比較,我一定會使用 C / C++。若果我需要編寫一個相片簿系統,我會使用 PHP 或者 C#(我認為製作用戶介面方面 .NET 語言比網頁更加)。
2. php面試題 memcache和redis的區別
Redis與Memcached的區別傳統MySQL+ Memcached架構遇到的問題實際MySQL是適合進行海量數據存儲的,通過Memcached將熱點數據載入到cache,加速訪問,很多公司都曾經使用過這樣的架構,但隨著業務數據量的不斷增加,和訪問量的持續增長,我們遇到了很多問題:1.MySQL需要不斷進行拆庫拆表,Memcached也需不斷跟著擴容,擴容和維護工作占據大量開發時間。2.Memcached與MySQL資料庫數據一致性問題。3.Memcached數據命中率低或down機,大量訪問直接穿透到DB,MySQL無法支撐。4.跨機房cache同步問題。眾多NoSQL百花齊放,如何選擇最近幾年,業界不斷涌現出很多各種各樣的NoSQL產品,那麼如何才能正確地使用好這些產品,最大化地發揮其長處,是我們需要深入研究和思考的問題,實際歸根結底最重要的是了解這些產品的定位,並且了解到每款產品的tradeoffs,在實際應用中做到揚長避短,總體上這些NoSQL主要用於解決以下幾種問題1.少量數據存儲,高速讀寫訪問。此類產品通過數據全部in-momery 的方式來保證高速訪問,同時提供數據落地的功能,實際這正是Redis最主要的適用場景。2.海量數據存儲,分布式系統支持,數據一致性保證,方便的集群節點添加/刪除。3.這方面最具代表性的是dynamo和bigtable 2篇論文所闡述的思路。前者是一個完全無中心的設計,節點之間通過gossip方式傳遞集群信息,數據保證最終一致性,後者是一個中心化的方案設計,通過類似一個分布式鎖服務來保證強一致性,數據寫入先寫內存和redo log,然後定期compat歸並到磁碟上,將隨機寫優化為順序寫,提高寫入性能。4.Schema free,auto-sharding等。比如目前常見的一些文檔資料庫都是支持schema-free的,直接存儲json格式數據,並且支持auto-sharding等功能,比如mongodb。面對這些不同類型的NoSQL產品,我們需要根據我們的業務場景選擇最合適的產品。Redis適用場景,如何正確的使用前面已經分析過,Redis最適合所有數據in-momory的場景,雖然Redis也提供持久化功能,但實際更多的是一個disk-backed的功能,跟傳統意義上的持久化有比較大的差別,那麼可能大家就會有疑問,似乎Redis更像一個加強版的Memcached,那麼何時使用Memcached,何時使用Redis呢?如果簡單地比較Redis與Memcached的區別,大多數都會得到以下觀點:1 Redis不僅僅支持簡單的k/v類型的數據,同時還提供list,set,zset,hash等數據結構的存儲。2 Redis支持數據的備份,即master-slave模式的數據備份。3 Redis支持數據的持久化,可以將內存中的數據保持在磁碟中,重啟的時候可以再次載入進行使用。拋開這些,可以深入到Redis內部構造去觀察更加本質的區別,理解Redis的設計。在Redis中,並不是所有的數據都一直存儲在內存中的。這是和Memcached相比一個最大的區別。Redis只會緩存所有的 key的信息,如果Redis發現內存的使用量超過了某一個閥值,將觸發swap的操作,Redis根據「swappability = age*log(size_in_memory)」計 算出哪些key對應的value需要swap到磁碟。然後再將這些key對應的value持久化到磁碟中,同時在內存中清除。這種特性使得Redis可以 保持超過其機器本身內存大小的數據。當然,機器本身的內存必須要能夠保持所有的key,畢竟這些數據是不會進行swap操作的。同時由於Redis將內存 中的數據swap到磁碟中的時候,提供服務的主線程和進行swap操作的子線程會共享這部分內存,所以如果更新需要swap的數據,Redis將阻塞這個 操作,直到子線程完成swap操作後才可以進行修改。使用Redis特有內存模型前後的情況對比:VM off: 300k keys, 4096 bytes values: 1.3G usedVM on: 300k keys, 4096 bytes values: 73M usedVM off: 1 million keys, 256 bytes values: 430.12M usedVM on: 1 million keys, 256 bytes values: 160.09M usedVM on: 1 million keys, values as large as you want, still: 160.09M used當 從Redis中讀取數據的時候,如果讀取的key對應的value不在內存中,那麼Redis就需要從swap文件中載入相應數據,然後再返回給請求方。 這里就存在一個I/O線程池的問題。在默認的情況下,Redis會出現阻塞,即完成所有的swap文件載入後才會相應。這種策略在客戶端的數量較小,進行 批量操作的時候比較合適。但是如果將Redis應用在一個大型的網站應用程序中,這顯然是無法滿足大並發的情況的。所以Redis運行我們設置I/O線程 池的大小,對需要從swap文件中載入相應數據的讀取請求進行並發操作,減少阻塞的時間。如果希望在海量數據的環境中使用好Redis,我相信理解Redis的內存設計和阻塞的情況是不可缺少的。補充的知識點:memcached和redis的比較1 網路IO模型Memcached是多線程,非阻塞IO復用的網路模型,分為監聽主線程和worker子線程,監聽線程監聽網路連接,接受請求後,將連接描述字pipe 傳遞給worker線程,進行讀寫IO, 網路層使用libevent封裝的事件庫,多線程模型可以發揮多核作用,但是引入了cache coherency和鎖的問題,比如,Memcached最常用的stats 命令,實際Memcached所有操作都要對這個全局變數加鎖,進行計數等工作,帶來了性能損耗。(Memcached網路IO模型)Redis使用單線程的IO復用模型,自己封裝了一個簡單的AeEvent事件處理框架,主要實現了epoll、kqueue和select,對於單純只有IO操作來說,單線程可以將速度優勢發揮到最大,但是Redis也提供了一些簡單的計算功能,比如排序、聚合等,對於這些操作,單線程模型實際會嚴重影響整體吞吐量,CPU計算過程中,整個IO調度都是被阻塞住的。2.內存管理方面Memcached使用預分配的內存池的方式,使用slab和大小不同的chunk來管理內存,Item根據大小選擇合適的chunk存儲,內存池的方式可以省去申請/釋放內存的開銷,並且能減小內存碎片產生,但這種方式也會帶來一定程度上的空間浪費,並且在內存仍然有很大空間時,新的數據也可能會被剔除,原因可以參考Timyang的文章:/memcached/)。Memcached的客戶端軟體實現非常多,包括C/C++, PHP, Java, Python, Ruby, Perl, Erlang, Lua等。當前Memcached使用廣泛,除了LiveJournal以外還有Wikipedia、Flickr、Twitter、Youtube和WordPress等。在Window系統下,Memcached的安裝非常方便,只需從以上給出的地址下載可執行軟體然後運行memcached.exe –d install即可完成安裝。在Linux等系統下,我們首先需要安裝libevent,然後從獲取源碼,make && make install即可。默認情況下,Memcached的伺服器啟動程序會安裝到/usr/local/bin目錄下。在啟動Memcached時,我們可以為其配置不同的啟動參數。1.1 Memcache配置Memcached伺服器在啟動時需要對關鍵的參數進行配置,下面我們就看一看Memcached在啟動時需要設定哪些關鍵參數以及這些參數的作用。1)-p Memcached的TCP監聽埠,預設配置為11211;2)-U Memcached的UDP監聽埠,預設配置為11211,為0時表示關閉UDP監聽;3)-s Memcached監聽的UNIX套接字路徑;4)-a 訪問UNIX套接字的八進制掩碼,預設配置為0700;5)-l 監聽的伺服器IP地址,默認為所有網卡;6)-d 為Memcached伺服器啟動守護進程;7)-r 最大core文件大小;8)-u 運行Memcached的用戶,如果當前為root的話需要使用此參數指定用戶;9)-m 分配給Memcached使用的內存數量,單位是MB;10)-M 指示Memcached在內存用光的時候返回錯誤而不是使用LRU演算法移除數據記錄;11)-c 最大並發連數,預設配置為1024;12)-v –vv –vvv 設定伺服器端列印的消息的詳細程度,其中-v僅列印錯誤和警告信息,-vv在-v的基礎上還會列印客戶端的命令和相應,-vvv在-vv的基礎上還會列印內存狀態轉換信息;13)-f 用於設置chunk大小的遞增因子;14)-n 最小的chunk大小,預設配置為48個位元組;15)-t Memcached伺服器使用的線程數,預設配置為4個;16)-L 嘗試使用大內存頁;17)-R 每個事件的最大請求數,預設配置為20個;18)-C 禁用CAS,CAS模式會帶來8個位元組的冗餘;2. Redis簡介Redis是一個開源的key-value存儲系統。與Memcached類似,Redis將大部分數據存儲在內存中,支持的數據類型包括:字元串、哈希表、鏈表、集合、有序集合以及基於這些數據類型的相關操作。Redis使用C語言開發,在大多數像Linux、BSD和Solaris等POSIX系統上無需任何外部依賴就可以使用。Redis支持的客戶端語言也非常豐富,常用的計算機語言如C、C#、C++、Object-C、PHP、Python、Java、Perl、Lua、Erlang等均有可用的客戶端來訪問Redis伺服器。當前Redis的應用已經非常廣泛,國內像新浪、淘寶,國外像Flickr、Github等均在使用Redis的緩存服務。Redis的安裝非常方便,只需從bin目錄下。在啟動Redis伺服器時,我們需要為其指定一個配置文件,預設情況下配置文件在Redis的源碼目錄下,文件名為redis.conf。php面試題 memcache和redis的區別
3. php面向對象面試題
其實這個問題很簡單啦,兩分鍾就可以請清楚啦,我在這里先說一下思想;
首先你得寫一個類表示人,如:person類;
小劉、小張、MrJosnon、MrJohn等都是這個person類的一個實例;
並且人力資源部問問題這是這個person類當中的一個方法,然後每個人都可以繼承自person類,然後又有各自己相關方法等;
然後你得寫一個國家類,如:Country類,然後中國是這個國家的一個具體實例;
然後你得寫一個城市類,如:City類;然後上海是City類的一個實例;
同樣,你得寫一個公司類,如:Company類,然後那兩個公司又是Company類的兩個實例,並且你還得寫一個部門類,如:Depart類,然後人力資源部是部門的一個實例;
上面只是這個問題的中文描述,你可以參考一下;
4. PHP面試題2--常用的數組函數
一,數組操作的基本函數
1. 數組的鍵名與值
array_values($arr); 獲得數組的值
array_keys($arr); 獲得數組的鍵名
array_flip($arr); 數組的值與鍵名互換(如果有重復前面的會被後面的覆蓋)
in_array("apple",$arr); 在數組中檢索apple
array_search("apple",$arr); 在數組中檢索apple,如果存在返回鍵名
array_key_exists("apple",$arr); 檢索給定的鍵名是否存在數組中
isset($arr["apple"]); 檢索給定的鍵名是否存在數組中
array_unique() 刪除數組中的重復值
2. 數組的內部指針
current($arr); 返回數組中的當前單元
pos($arr); 返回數組中的當前單元
key($arr); 返回數組中的當前單元的鍵名
prev($arr); 將數組中的內部指針倒回一位
next($arr); 將數組中的內部指針向前移動一位
end($arr); 將數組中的內部指針指向最後一單元
reset($arr); 將數組中的內部指針指向第一單元
each($arr); 將返回數組當前元素的一個鍵/值的構造數組,並使數組指針向前移動一位
list($key,$value) = each($arr); 獲得數組當前元素的鍵名和值
3. 數組和變數之間的轉換
extract(array,extract_rules,prefix); 函數從數組中將變數導入到當前符號表。該函數使用數組鍵名作為變數名,使用數組鍵值作為變數值。針對數組中的每個元素,將在當前符號表中創建對應的一個變數。
compact(var1,var2...); 創建一個包含變數名和它們的值的數組。任何沒有變數名與之對應的字元串都被略過。
二,數組的分段和填充
1. 數組的分段
array_slice(array,start,length,preserve); 返回數組中的選定部分。如果數組中有字元串鍵名,返回的數組將保留鍵名。
array_splice(array1,start,length,array2); 從數組中移除選定的元素,並用新元素取代它。函數返回被移除元素的數組,如果函數沒有移除任何元素(length=0),則替代數組將從start參數的位置插入。不保留替代數組的鍵名。
2. 數組的分割
array_chunk(array,size,preserve_keys); 把一個數組分割為新的數組塊。
3. 數組的填充
array_pad(array,size,value); 將指定數量的帶有指定值的元素插入到數組。如果將size參數設置為負數,該函數會在原始數組之前插入新的元素。如果size參數小於原始數組的長度,該函數不會刪除任何元素。
三,數組與棧
array_push(array,value1,value2...); 向數組尾部插入一個或多個元素。即使數組有字元串鍵名,添加的元素將是數字鍵名。
array_pop(array); 刪除數組的最後一個元素。返回值是數組的最後一個值,即,被刪除的元素值。如果數組為空,或者不是一個數組,將返回NULL。
四,數組和隊列
array_shift(array); 用於刪除數組中的第一個元素,並返回被刪除的元素。如果鍵名是數字,所有的元素都將獲得新的鍵名,從0開始,並以1遞增。
array_unshift(array,value1,value2,value3...); 用於向數組插入新元素,新數組的值將被插入到數組的開頭。數值鍵名將從0開始,以1遞增。字元串鍵名將保持不變。
五,回調函數
array_walk(array,myfunction,parameter...); 將數組中的每個元素應用到 用戶自定義函數。在函數中,數組的鍵名和鍵值是參數。可以通過把用戶自定義函數的第一個參數指定為引用:&$value,來改變數組元素的值。
array_map(myfunction,array1,array2,array3...); 函數將用戶自定義函數作用到數組中的每個值上,並返回用戶自定義函數作用後的帶有新的值的數組。myfunction可以為null
array array_filter ( array $array [, callable $callback [, int $flag = 0 ]] ); 用回調函數過濾數組中的元素。該函數把輸入數組中的每個鍵值傳給回調函數。如果回調函數返回true,則把輸入數組中的當前鍵值返回給結果數組,數組鍵名保持不變。
array_rece(array,myfunction,initial); 函數發送數組中的值到用戶自定義函數,並返回一個字元串。如果數組是空的或者初始值未傳遞,該函數返回null。initial為可選,規定發送到函數處理的第一個值。
六,數組的計算
1. 數組元素的求和
array_sum(array); 返回數組中的所有值的和
2. 數組的合並
array_merge(array1,array2,array3...); 用於把一個或多個數組合並成一個數組。如果兩個或更多個數組有相同的鍵名。則最後的數組會覆蓋其他數組。如果向函數輸入了一個數組,且鍵名是整數,則該函數會返回帶有整數鍵名的新數組,其鍵名以0開始進行重新索引。
array_merge_recursive(array1,array2,array3...); 用於把一個或多個數組合並為一個數組,該函數與array_merge()函數之間的不同是在處理兩個或多個數組元素有相同的鍵名的情況下,array_merge_recursive()不會進行鍵名覆蓋,而是將多個相同鍵名的值遞歸組成一個數組。如果您僅僅向 array_merge_recursive() 函數輸入一個數組,結果與 array_merge() 相同。
3. 數組的差集
array_diff(array1,array2,array3...); 函數用於比較兩個(或更多個)數組的值,並返回差集。該函數比較兩個(或更多個)數組的值(key=>value中的value),並返回一個差集數組,該數組包括了所有在被比較的數組(array1)中,但是不在任何其他參數數組(array2或array3等等)中的值。
array_diff_assoc(array1,array2,array3...); 函數用於比較兩個(或更多個)數組的鍵名和鍵值,並返回差集。該函數比較兩個(或更多個)數組的鍵名和鍵值,並返回一個差集數組,該數組包括了所有在被比較的數組(array1)中,但是不在任何其他參數數組(array2 或 array3 等等)中的鍵名和鍵值。
4. 數組的並集
array_intersect(array1,array2,array3...); 函數用於比較兩個(或更多個)數組的鍵值,並返回交集。該函數比較兩個(或更多個)數組的鍵值,返回一個交集數組,該數組包括了所有在被比較的數組(array1)中,同時也在任何其他參數數組(array2 或 array3 等等)中的鍵值。
array_intersect_assoc(array1,array2,array3...); 函數用於比較兩個(或更多個)數組的鍵名和鍵值,並返回交集。該函數比較兩個(或更多個)數組的鍵名和鍵值,並返回一個交集數組,該數組包括了所有在被比較的數組(array1)中,同時也在任何其他參數數組(array2 或 array3 等等)中的鍵名和鍵值。
七,數值的排序
array_multisort(): 對多個數組或多維數組進行排序
sort(): 以升序對數組排序
rsort(): 以降序對數組排序
asort(): 根據值,以升序對關聯數組進行排序
ksort(): 根據鍵,以升序對關聯數組進行排序
arsort(): 根據值,以降序對關聯數組進行排序
krsort(): 根據鍵,以降序對關聯數組進行排序
資料參考:
https://www.php.cn/php-weizijiaocheng-381347.html
https://www.runoob.com/php/php-ref-array.html
5. PHP程序員上機面試題(並附答案,回答好的加分)
題集網上有一套php的面試題:http://www.tijee.com/tags/46-php-face-questions/posts
6. PHP面試題如何防止伺服器資源被其他網站盜用,並寫出相關代碼
得看是什麼資源了
1,如果是媒體(圖片,聲音,視頻),則是使用Rewrite的重定向,要實現這個東西很簡單,貌似你問問度娘《圖片防盜鏈》就有你看不完的答案了。
2,如果是重要的文件(如配置文件或其它的),那就一定要用 .htaccess文件了。
在.htaccess文件中寫入以下代碼:
OrderDeny,Allow
Denyfromall
Allowfrom127.0.0.1
只可讓本機訪問,其它全部拒絕,保存。放到你要設防的目錄下。之後,你那目錄就安全了
7. php面試題(假設有一個博客系統,資料庫存儲採用mysql。。。。)
讓我來告訴你吧!那就是傳說中的xp系統!SPIRIT ARE ALWAYS WITH YOU
8. PHP面試題之文件目錄操作
這道題其實並不難,考點主要在函數substr()
strrchr()
array_pop()
strrpos()
strpos()
strrev()
explode()
pathinfo()。
廢話不多說了,直接給大家貼代碼了。
獲取文件後綴,遍歷目錄層次
/**
*
5種方式獲取文件後綴名
*
這道題其實就是考函數substr()
strrchr()
array_pop()
strrpos()
strpos()
strrev()
explode()
pathinfo()
*
@param
string
$filename
要處理的文件名
1.jpg/1.png/1.html/1.php
*
@return
string
.php/php
*/
function
get_ext1($filename)
{
return
strrchr($filename,'.');
}
function
get_ext2($filename){
return
substr($filename,strrpos($filename,'.'));
}
function
get_ext3($filename){
return
array_pop(explode('.',$filename));
}
function
get_ext4($filename){
return
pathinfo($filename,PATHINFO_EXTENSION);
}
function
get_ext5($filename){
return
strrev(substr(strrev($filename),0,strpos(strrev($filename),'.')));
}
$filename
=
"1.php";
echo
get_ext1($filename)."\n";
echo
get_ext2($filename)."\n";
echo
get_ext3($filename)."\n";
echo
get_ext4($filename)."\n";
echo
get_ext5($filename)."\n";
/**
*
遍歷目錄(遞歸)
*
@param
string
$dir
目錄名且最後沒有/
*
@return
array
$files
整個目錄結構
*/
function
myScandir($dir)
{
$files
=
array();
if($handle
=
opendir($dir)){
while
(($file
=
readdir($handle))
!=
false){
if($file
!=
"."
&&
$file
!=
".."){
$newDir
=
$dir."/".$file;
if(is_dir($newDir)){
$files[$file]
=
myScandir($newDir);
}else{
$files[]
=
$file;
}
}
}
closedir($handle);
return
$files;
}
}
$dir
=
"/dirname";
print_r(myScandir($dir));
以上代碼是不是很簡單啊,就這幾個函數,函數掌握了,這道題就很容易的解決了,希望本文分享對大家有所幫助。
9. 程序員面試必備PHP基礎面試題 – 第十一天
一、兩張表 city表和province表。分別為城市與省份的關系表。
表名:city
id City Provinceid
1 廣州 1
2 深圳 1
3 惠州 1
4 長沙 2
5 武漢 3
………. 廣州
表名稱:province:
id Province
1 廣東
2 湖南
3 湖北
……….
1、寫一條sql語句關系兩個表,實現:顯示城市的基本信息。顯示欄位:城市id ,城市名, 所屬省份 。
如:
Id(城市id) Cityname(城市名) Privence(所屬省份)
2、如果要統計每個省份有多少個城市,請用group by 查詢出來。顯示欄位:省份id ,省份名,包含多少個城市。
二、主鍵 和外鍵表示什麼?一般用於做什麼?
主鍵:能夠唯一表示數據表中的每個記錄的欄位或者欄位的組合就稱為主鍵。一個主鍵是唯一識別一個表的每一行記錄,但這只是其作用的一療分,主鍵的主要作用是將記錄和存放在其他表中的數據進行關聯,在這一點上,主鍵是不同表中各記錄間的簡單指針,主鍵約整就是確定表中的每一條記錄,主鍵不能是空值,唯一約束是用於指定一個或多個列的組合值具有唯一性,以防止在列中輸入重復的值,所以,主鍵的值對用戶而言是沒有什麼意義,並且和它賦予的值也沒有什麼特別聯系。
外鍵:若有兩個表A,B,C是A的主鍵,而B中也有C欄位,則C就是表B的外鍵,外鍵約束主要用來維護兩個表之間數據的一致性。A為基本表,B為信息表。
在資料庫中,常常不只是一個表,這些表之間也不是相互獨立的,不同的表之間需要建立一種關系,才能將它們的數據相互溝通,而在這個溝通過程中,就需要表中有一個欄位作為標志,不同的記錄對應的欄位取值不能相同,也不能是空白的,通過這個欄位中不同的值可以區別各條記錄,就像我們區別不同的人,每個人都有名字,但它卻不能作為主鍵,因為人名很容易出現重復,而身份證號是每個人都不同的,所以可以根據它來區別不同的人,資料庫的表中作為主鍵的段段就要像人的身份證號一樣,必須是每個記錄的值都不同,這才能根據
主鍵的值來確定不同的記錄。
關系:外鍵一定是另外某個表的主鍵。
三、select now(),Date_ADD(now(),INTERVAL 14 day),Date_SUB(now(),INTERVAL 3 Day) from table; 會獲得什麼內容,請寫出來。
會獲得三條數據:
第一條:當前時間;
第二條:當前時間加上14天;
第三條:當前時間減去3天。
四、您所知道的MYSQL 資料庫備份,還原方式有哪幾種?
備份:
一,搭建主從架構,master-slave,通過binlog文件同步復制主庫的數據,也可以直接通過binlog文件恢復數據。
二,通過系統計劃任務執行mysqlmp做周期性全備份。
三,物理備份,直接拷貝數據文件、參數文件、日誌文件。
還原:
一.通過mysql操作工具,如phpmyadmin,sqlyog等導入備份過的資料庫文件。
二.將物理備份的文件拷貝到mysql的data目錄下
五、內容管理系統中,表message有如下欄位
id 文章id
title 文章標題
content 文章內容
category_id 文章分類id
hits 點擊量
創建上表,寫出MySQL語句
六、同樣上述內容管理系統:表comment記錄用戶回復內容,欄位如下
comment_id 回復id
id 文章id,關聯message表中的id
comment_content 回復內容
現通過查詢資料庫需要得到以下格式的文章標題列表,並按照回復數量排序,回復最高的排在最前面
文章id 文章標題 點擊量 回復數量
用一個SQL語句完成上述查詢,如果文章沒有回復則回復數量顯示0
七、內容管理系統,表category保存分類信息,欄位如下
category_id int(4) not null auto_increment;
category_name varchar(40) not null;
用戶輸入文章時,通過選擇下拉菜單選定文章分類
寫出如何實現這個下拉菜單
八、PHP文件操作
1、內容管理系統:用戶提交內容後,系統生成靜態HTML頁面;寫出實現的基本思路
2、簡單描述用戶修改發布內容的實現流程和基本思路
1)當用戶提交後生成一個由url地址MD5後的文件的編譯頁面,用文件處理file函數生成一個模板合成頁,判斷模板編譯頁是否有,模板頁無或者編譯頁的創建時間戳小於模板頁的修改時間都會從新生成編譯頁面,編譯後的頁面會調用對應資料庫的值顯示在頁面中,通過對內存數據的讀取釋放,顯示出我們看到的靜態數據,然後用file文件將其保存起來生成靜態的頁面
2)當用戶修改了發布內容都會修改數據相關的內容,並通過編譯頁面更新靜態數據並用文件的方式緩存起來,當用戶查看時將不做任何資料庫查找,直接調用該緩存文件即可