php基礎知識收集–數組、文件、字符串、文件、會話

1、數組的概念是什麼?數組根據索引分為哪兩種,如何區分?數組的賦值方式有哪兩種?

 數組是一個可以存儲一組或一系列數值的變量(復合型變量)
 索引數組(索引值為數字,以0開始)和關聯數組(以字符串作為索引值)
 數組的賦值方式有哪兩種?
 數組的聲明方式主要有兩種。
 1.通過array()函數聲明數組;
     可以通過key=>value的方式分別定義索引和值,也可以不定義數組的索引下標,隻給出數組的元素值。
 2.直接為數組元素賦值,不需要調用array()函數。例如:
      $arr[0] = 1;
      $arr[1] = 2;
 特別註意:
 數組的下標如果是等價於整數的字符串值(但不能以0開頭),則會被當作整數對待。
     例如: $array[3] 與  $array['3'] 引用的是相同的一個元素,而 $array['03'] 引用的則就是另外的一個元素瞭。

2、數組如何遍歷?

 ①for循環
 ②foreach循環  ,這是最常用的遍歷方式。用法如下:foreach($arr as $key=>$value){}
 ③list each 和while 配合起來循環

$arr = array('你','若','安','好','便','是','晴','天');
while(list($k,$v)=each($arr)){
    echo $k,'~',$v,'
';
}

3、list的用法
來看一個例子:

<!--?php 

list($a,$b)=array(10,20);
echo $a,'~',$b,'
'; //返回10~20 ?>

沒錯可以給一組變量賦值

再來看另外一個例子:

10,3=>20,4=>30,1=>40);
echo $a,'~',$b,'~',$c,'
';
//返回notice~40~20
//執行到$a的時候返回給我一個notice:說數組沒有0鍵
?>

按照一般的想法應該會返回:10~20~40
為什麼會返回這個notice~40~20呢?
答:這涉及到list的運行機制,list是這麼賦值的
  首先:不要管右邊的數組,看List裡面的變量,從左到右應該是 $a = arr[0] $b=arr[1] $c=arr[3]
  然後:從右到左開始賦值,賦值的順序是 $c=arr[3] $b=arr[1] $a=arr[0]
所以$c=20 $b = 40 因為沒有arr[0],所以$a給瞭一個警告

4、foeach數組的時候指針是如何指向的?list()/each()/while()循環數組的時候指針如何指向的呢?

     當foreach開始執行的時候,數組內部的指針會自動指向第一個單元。因為foreach所操作的是指定數組的拷貝,而不是該數組本身。
    而each()一個數組後,數組指針將停留在數組中的下一個單元或者碰到數組結尾時停留在最後一個單元。如果要再次使用each()遍歷數組,必須要使用reset().
    reset()將數組的內部指針倒回到第一個單元並返回第一個數組單元的值。

5、如何計算數組長度(或者說計算數組中所有元素的個數)?字符串怎麼取長度?

 count() -- 計算數組中的元素個數。
 可以使用count(數組名)或者count(數組名,1),如果有第二個參數,並且是數字1,則表示遞歸統計數組元素的個數。
 如果第二個參數是數字0,則等同於隻有一個參數的count()函數。
 sizeof() -- count() 的別名
 字符串:strlen()、mb_strlen();

6、數組中相關的常用函數有哪些?

 1) count --(sizeof別名)— 計算數組中的單元數目或對象中的屬性個數   
  例如:int count ( mixed $var [, int $mode ] )  $var 通常都是數組類型,任何其它類型都隻有一個單元。  $mode 默認值為0. 1為開啟遞歸地對數組計數
 2) in_array ( mixed $needle , array $haystack [, bool $strict ] ) — 檢查數組中是否存在某個值。
  如果 needle 是字符串,則比較是區分大小寫的。
  如果第三個參數 strict 的值為 TRUE 則 in_array() 函數還會檢查 needle 的類型是否和 haystack 中的相同。
 3) array_merge(array $array1 [, array $array2 [, array $... ]] ) 將一個或多個數組的單元合並起來,一個數組中的值附加在前一個數組的後面。返回作為結果的數組。 
  特別註意:如果輸入的數組中有相同的字符串鍵名,則該鍵名後面的值將覆蓋前一個值。然而,如果數組包含數字鍵名,後面的值將不會覆蓋原來的值,而是附加到後面。 
  如果隻給瞭一個數組並且該數組是數字索引的,則鍵名會以連續方式重新索引
 4) 數組與字符串之間的轉換
  (1)explode ( string $separator , string $string [, int $limit ] )  使用一個分隔字符來分隔一個字符串。
  (2)implode ( string $glue , array $arr )  使用一個連接符將數組中的每個單元連接為一個字符串。
  join 為 implode 的別名
 5) sort(array &$array [, int $sort_flags ]) — 對數組按照值排序,當本函數結束時數組單元將被從最低到最高重新安排。

7、數組合並函數array_merge()和數組加法運算$arr + $arr2 的區別是什麼?

 array_merge()->使用array_merge(),如果是關聯數組合並,如果數組的鍵名相同,那麼後面的值將覆蓋前者;如果是數字索引數組合並,則不覆蓋,而是
 後者附加到前者後面。
 "+"->使用數組加法運算,與array_merge()不同,加法運算不管是關聯數組還是數字索引數組,都是將相同鍵名的的值舍棄,
 也就是隻保留首次出現該鍵名的元素,後來的具有相同鍵名的元素都不會被加進來。

8、echo(),print(),print_r()的區別?

 (1)echo 是語法,Output one or more strings,沒有返回值;
 (2)print 是函數,不能輸出數組和對象,Output a string,print有返回值;
 (3)print_r 是函數,可以輸出數組。print_r是個比較有意思的函數,可以輸出stirng、int、float、array、object等,輸出array時會用結構表示,print_r輸出成功時返回true;而且print_r可以通過print_r($str,true)來,使print_r不輸出而返回print_r處理後的值。此外,對於echo和print,基本以使用echo居多,因為其效率比print要高。

9、按照功能分類說說都有哪些字符串處理函數?這些函數的作用是什麼?

 A. 字符串輸出函數
 (1)echo $a,$b,$c......;  是一個語言結構,而不是一個真正的函數。
 (2)print($a)    本函數輸出字符串。若成功則返回 1,失敗返回 0
 (3)print_r($a)
 (4)var_dump($a); 能輸出類型、長度、值
 B. 去除字符串首尾空格的函數: trim  ltrim  rtrim(別名:chop)   使用第二個參數,還可以去除指定的字符。
 C. 轉義字符串函數:addslashes()
 D. 獲取字符串長度的函數:strlen()
 E. 截取字符串長度的的函數:substr()
 F. 檢索字符串函數: strstr() , strpos()
 G. 替換字符串函數:str_replace()

10、請給出以下問題的正確答案?

     1).$arr = array('james', 'tom', 'symfony');請將$arr數組的值合並成字符串輸出?
      echo implode(‘,’,$arr);
     2).$str = ‘jack,james,tom,symfony’; 請將$str用’,’分割,並把分割後的值放到$arr數組中?
      $arr = explode(‘,’,$str);
     3).$arr = array(3,7,2,1,’d’,’abc’); 請將$arr按照從大到小的順序排序,並保持其鍵值不變?
      arsort($arr); print_r($arr);
      sort() 函數用於對數組單元從低到高進行排序。
      rsort() 函數用於對數組單元從高到低進行排序。
      asort() 函數用於對數組單元從低到高進行排序並保持索引關系。
      arsort() 函數用於對數組單元從高到低進行排序並保持索引關系。
      ksort() 函數用於對數組單元按照鍵名從低到高進行排序。
      krsort() 函數用於對數組單元按照鍵名從高到低進行排序。
 4).$mail = “gaofei@163.com”; 請將此郵箱的域(163.com)取出來並打印,看最多能寫出幾種方法?
    echo strstr($mail,'163');
    echo substr($mail,7);
    $arr = explode("@",$mail); echo $arr[1];
    strstr是匹配後截取。 
    substr是不匹配,根據起始位置,進行截取
 5). 如果有一個字符串,該字符串是“123,234,345,”。請問如何切割掉這個字符串最後一個逗號?
     rtrim($str,",");
 6). 獲取隨機數的函數有哪幾個?mt_rand() 和 rand()哪個執行速度快?
     mt_rand()

11、頁面字符出現亂碼,怎麼解決?

 1.首先考慮當前文件是不是設置瞭字符集。查看是不是meta標簽中寫瞭charset,如果是php頁面還可以看看是不是在header()函數中指定瞭charset;
 例如:
 

header(“content-type:text/html;charset=utf-8”); 2.如果設置瞭字符集(也就是charset),那麼判斷當前文件保存的編碼格式是否跟頁面設置的字符集保持一致,兩者必須保持統一; 3.如果涉及到從伺服器提取數據,那麼判斷伺服器查詢時的字符集是否跟當前頁面設置的字符集一致,兩者必須統一, 例如:mysql_query(“set names utf8”)。

12、正則表達式是什麼?php中有哪些常用的跟正則相關的函數?

 正則表達式是用於描述字符排列模式的一種語法規則。正則表達式也叫做模式表達式。
 網站開發中正則表達式最常用於表單提交信息前的客戶端驗證。
 比如驗證用戶名是否輸入正確,密碼輸入是否符合要求,email、手機號碼等信息的輸入是否合法。
 在php中正則表達式主要用於字符串的分割、匹配、查找和替換操作。

 preg系列函數可以處理。具體有以下幾個:

 string preg_quote ( string str [, string delimiter] )
  轉義正則表達式字符 正則表達式的特殊字符包括:. \\ + * ? [ ^ ] $ ( ) { } = ! < > | :。
 preg_replace -- 執行正則表達式的搜索和替換
 mixed preg_replace ( mixed pattern, mixed replacement, mixed subject [, int limit] )
 preg_replace_callback -- 用回調函數執行正則表達式的搜索和替換
 mixed preg_replace_callback ( mixed pattern, callback callback, mixed subject [, int limit] )
 preg_split -- 用正則表達式分割字符串
 array preg_split ( string pattern, string subject [, int limit [, int flags]] )

13、preg_replace()和 str_ireplace()兩個函數在使用上有什麼不同?preg_split()和split()函數如何使用?

str_replace() 函數使用一個字符串替換字符串中的另一些字符
preg_replace -- 執行正則表達式的搜索和替換
preg_ split() 函數用於正則表達式分割字符串。
split() 函數同 preg_split() 類似,用正則表達式將字符串分割到數組中,返回一個數組,但推薦使用 preg_split() 。

14、在url中用get傳值的時候,若中文出現亂碼,應該用哪個函數對中文進行編碼?

 用戶在網站表單提交數據的時候,為瞭防止腳本攻擊(比如用戶輸入<script>alert(111);</script>),php端接收數據的時候,應該如何處理?
 使用urlencode()對中文進行編碼,使用urldecode()來解碼。 
 使用htmlspecialchars($_POST[‘title’])來過濾表單傳參就可以避免腳本攻擊。

15、連接伺服器操作的步驟是什麼?每一步的返回值是什麼數據類型?尤其是mysql_query()返回什麼數據類型?

mysql_connect($mysql_server_name, $mysql_username,$mysql_password);
mysql_query() 僅對 SELECT,SHOW,EXPLAIN 或 DESCRIBE 語句返回一個資源標識符


實例:
//定義常量
define(DB_HOST, 'localhost');
define(DB_USER, 'root');
define(DB_PASS, '111111');
define(DB_DATABASENAME, 'test');
define(DB_TABLENAME, 't_student');
//伺服器表的列名
$dbcolarray = array('id', 'name', 'age');

//mysql_connect
$conn = mysql_connect(DB_HOST, DB_USER, DB_PASS) or die("connect failed" . mysql_error());
mysql_select_db(DB_DATABASENAME, $conn);

//讀取表中紀錄條數
$sql = sprintf("select count(*) from %s", DB_TABLENAME);
$result = mysql_query($sql, $conn);
if ($result)
{
    $count = mysql_fetch_row($result);
}
else
{
    die("query failed");
}
echo "表中有$count[0] 條記錄
";


$sql = sprintf("select %s from %s", implode(",",$dbcolarray), DB_TABLENAME);
$result = mysql_query($sql, $conn);
//表格
echo ''; 
//表頭
$thstr = "";
echo $thstr;
//表中的內容
while ($row=mysql_fetch_array($result, MYSQL_ASSOC))//與$row=mysql_fetch_assoc($result)等價
{
    echo "";
    $tdstr = "";
    foreach ($dbcolarray as $td)
        $tdstr .= "";
    echo $tdstr;
    echo "";
}
echo "
" . implode(" ", $dbcolarray) . "
$row[$td]

"; mysql_free_result($result); mysql_close($conn);

16、說說mysql_fetch_row() 和mysql_fetch_assoc()和mysql_fetch_array之間有什麼區別?

 第一個是返回結果集中的一行作為索引數組,第二個是返回關聯數組,而第三個既可以返回索引數組也可以返回關聯數組,取決於它的第二個參數 MYSQL_BOTH MYSQL_NUM  MYSQL_ASSOC 默認為MYSQL_BOTH
 $sql =”select * from table1”;
 $result = mysql_query($sql);
 mysql_fetch_array($result, MYSQL_NUM);
 [數據相關函數](https://blog.csdn.net/havedream_one/article/details/51346564#t9)

17、打開、關閉文件分別是什麼函數? 文件讀寫是什麼函數?刪除文件是哪個函數? 判斷一個文件是否存在是哪個函數?新建目錄是哪個函數?

    打開文件:fopen()
    關閉文件:fclose()
    讀文件:fgets(fp) file() get_file_contents(),fread() 
    寫文件:fwrite(),fputs(),file_put_contents()
    刪除文件:unlink()
    判斷文件是否存在:file_exists
    新建目錄:mkdir();
    相關連接:[文件相關函數](https://blog.csdn.net/havedream_one/article/details/51346564#t5)

18、文件上傳需要註意哪些細節?怎麼把文件保存到指定目錄?怎麼避免上傳文件重名問題?

 1.首現要在php.ini中開啟文件上傳;
 2.在php.ini中有一個允許上傳的最大值,默認是2MB。必要的時候可以更改;
 3.上傳表單一定要記住在form標簽中寫上enctype="multipart/form-data";
 4. 提交方式 method 必須是 post;
 5. 設定 type="file" 的表單控件;
 6.要註意上傳文件的大小MAX_FILE_SIZE、文件類型是否符合要求,上傳後存放的路徑是否存在。
 可以通過上傳的文件名獲取到文件後綴,然後使用時間戳+文件後綴的方式為文件重新命名,這樣就避免瞭重名。
 可以自己設置上傳文件的保存目錄,與文件名拼湊形成一個文件路徑,使用move_uploaded_file(),就可以完成將文件保存到指定目錄。

19、$_FILES是幾維數組?第一維和第二維的索引下標分別是什麼?批量上傳文件的時候需要註意什麼?

 二維數組。第一維是上傳控件的name,二維下標分別為name/type/tmp_name/size/error.

20、什麼是會話控制?

    簡單地說會話控制就是跟蹤和識別用戶信息的機制。會話控制的思想就是能夠在網站中跟蹤一個變量,通過這個變量,系統能識別出相應的用戶信息,根據這個用戶信息可以得知用戶權限,從而展示給用戶適合於其相應權限的頁面內容。
    目前最主要的會話跟蹤方式有cookie,session。

21、會話跟蹤的基本步驟

 1).訪問與當前請求相關的會話對象
 2).查找與會話相關的信息
 3).存儲會話信息
 4).廢棄會話數據

22、使用cookie的註意事項有哪些?

 1) setcookie()之前不可以有任何頁面輸出,就是空格,空白行也不可以;
 2) setcookie()後,在當前頁面調用$_COOKIE['cookiename']不會有輸出,必須刷新或到下一個頁面才可以看到cookie值;
 3) 不同的瀏覽器對cookie處理不同,客戶端可以禁用cookie,瀏覽器也可以閑置cookie的數量,一個瀏覽器能創建的cookie數量最多300個,並且每個不可以超過4kb,每個web站點能設置的cookie總數不能超過20個。
 4) cookie是保存在客戶端的,用戶禁用瞭cookie,那麼setcookie就不會起作用瞭。所以不可以過度依賴cookie。

23、session和cookie的使用步驟分別是什麼?什麼是sesssion和cookie的生命周期?session和cookie的區別是什麼?

    cookie是保存在客戶端機器的,對於未設置過期時間的cookie,cookie值會保存在機器的內存中,隻要關閉瀏覽器則cookie自動消失。如果設置瞭cookie的過期時間,那麼瀏覽器會把cookie以文本文件的形式保存到硬盤中,當再次打開瀏覽器時cookie值依然有效。

    session是把用戶需要存儲的信息保存在伺服器端。每個用戶的session信息就像是鍵值對一樣存儲在伺服器端,其中的鍵就是sessionid,而值就是用戶需要存儲信息。伺服器就是通過sessionid來區分存儲的session信息是哪個用戶的。

 兩者最大的區別就是session存儲在伺服器端,而cookie是在客戶端。session安全性更高,而cookie安全性弱。

    session在web開發中具有非常重要的份量。它可以將用戶正確登錄後的信息記錄到伺服器的內存中,當用戶以此身份訪問網站的管理後臺時,無需再次登錄即可得到身份確認。而沒有正確登錄的用戶則不分配session空間,即便輸入瞭管理後臺的訪問地址也不能看到頁面內容。通過session確定瞭用戶對頁面的操作權限。

 使用session的步驟:
 1. 啟動session:
    使用session_start()函數來啟動。
 2. 註冊會話:
     直接給$_SESSION數組添加元素即可。
 3. 使用會話:
    判斷session是否為空或者是否已經註冊,如果已經存在則像普通數組使用即可。
 4. 刪除會話:
  1.可以使用unset刪除單個session;
  2.使用$_SESSION=array()的方式,一次註銷所有的會話變量;
  3.使用session_destroy()函數來徹底銷毀session。

 cookie怎麼使用?
 1. 記錄用戶訪問的部分信息
 2. 在頁面間傳遞變量
 3. 將所查看的internet頁存儲在cookies臨時文件夾中,可以提高以後的瀏覽速度。
 創建cookie:
  setcookie(string cookiename , string value , int expire);
 讀取cookie:
  通過超級全局數組$_COOKIE來讀取瀏覽器端的cookie的值。
 刪除cookie:有兩種方法
  1.手工刪除方法:
   右擊瀏覽器屬性,可以看到刪除cookies,執行操作即可將所有cookie文件刪除。
  2.setcookie()方法:
   跟設置cookie的方法一樣,不過此時將cookie的值設置為空,有效時間為0或小於當前時間戳。

24、 如何設置一個cookie的名字為username,值為jack,並且讓此cookie一周後失效? 一個瀏覽器最多可以產生多少個cookie,每個cookie文件最大不能超過多少?

 setcookie(‘username’,’jack’,time()+7*24*3600);
 最多可以產生20個cookie,每個最多不超過4K

25、設置或讀取session之前,需要做什麼?

     可以直接在php.ini中開啟session.auto_start = 1或者在頁面頭部用session_start();開啟session,session_start()前面不能有任何輸出,包括空行。

26、在實際開發中,session在哪些場合使用?

 session用來存儲用戶登錄信息和用在跨頁面傳值。
 1)常用在用戶登錄成功後,將用戶登錄信息賦值給session;
 2)用在驗證碼圖片生成,當隨機碼生成後賦值給session。

26、 註銷session會話的形式有幾種?

 unset() 
 $_SESSION=array();
 session_destroy();

You May Also Like