PHP一些小教學(陣列、字串、函式)

看板b95902HW作者 (喬喬)時間17年前 (2007/01/07 21:46), 編輯推噓4(405)
留言9則, 6人參與, 最新討論串1/1
<陣列> 正如之前所說,PHP的一切都很類似於C,陣列也不例外。 PHP的陣列概念跟C完全相同,也同樣是用數值當索引來存取陣列內容,也是以0做起點。 不過,之前也學到PHP是不宣告變數。在以前,C要宣告陣列都是: int a[3]={1,2,3}; 在PHP中,因為沒有宣告的動作,可以用兩種方式來完成這樣的動作: $a[0]=1; $a[1]=2; $a[2]=3; 或是 $a = array(1,2,3); 前面的做法很直觀不需要解釋,注意的是後方。 在後面的作法中,$a是一個陣列變數,這一個變數就代表了整個變數(類似於C的指標說法) 。我們只要在後方加上數字索引,就可以輕鬆的存取和控制$a變數中的小變數了。 PHP另外支援另一種"關聯式陣列",也就是不需要用數字當作索引的陣列: $a = array( 'first'=>1 , 'second'=>2 , 'third'=>3 ); 這樣就可以把索引設定成文字了,這樣一來,$a['first']就等於1。 這樣的寫法或許有人會想起當時接收表單的語法: $num = $_POST['num']; 現在就可以對這個語法作陣列的解釋:在一個表單將資料送到php的網頁裡的時候,事 實上就是在php中建立了$_POST這個關聯式陣列,其索引值為表單中的name屬性,所以在 存取的時候就是以索引值來呼叫$_POST陣列的內容。 PHP對陣列有很多好用的運算子,分述如下: + 聯集 $a + $b 把$b的內容附加到$a的後方 == 相等 $a == $b 若$a和$b含有相同變數時為true === 全等 $a === $b 若$a和$b含有相同變數,且索引值都相同時為true != 不等 $a != $b 若$a和$b含不同元素時為true <> 不等 $a <> $b 同!= !== 不全等 $a !== $b 若$a和$b含有相同變數,但索引值不同時為true 當然,PHP同樣支援多維陣列,要在多維陣列放入值,語法如下: $a = array( array(1,2,3) , array(4,5,6) , array(7,8,9) ); 這樣的話,$a[1][2]=2 $a[3][3]=9。 PHP關於陣列的好用函式還有很多,其中最重要的應該是排序函式: sort($a) 這樣,就會把$a陣列的內容按照小到大排列。 例如,若$a = array( 3,2,1 ); sort($a)之後,$a[0]=1 $a[1]=2 $a[2]=3。 針對於關聯式陣列,則可以使用asortksort函式。 其中,asort會按照值排列,ksort則會以索引的字串來排列。 如果要從大到小排列,我們只需再sort前加r,分別形成rsort(),arsort(),krsort()三個 新的函式。不過,這些函式全部都只能對1維的陣列作用就是了。 另外也可以用shuffle函式對陣列任意排序,以達到"廣告"的效果(有些網站每次進去都 會顯示不同的產品)。 有了這些基本的知識,現在來實作一個簡單的留言板: 假設在存入資料的時候,我們把內容存成這樣的文件: (text.txt內容) 2007/1/7\tjoehuang90\thello\n 2007/1/7\tjack993\tyeah!\n 2007/1/8\thenry2007\tmessage\n 這份文件儲存使用者輸入的資訊,用\t(tab鍵)分隔,每筆資料則以換行字元\n分隔。 我們在這裡使用之前的file函式取出這些值,注意file函式會把整個檔案一次取出,並以 換行字元作分隔,把分割的每個資料變成陣列的元素。 於是: $data = file("text.txt"); 這時候: $data[0] = "2007/1/7\tjoehuang90\thello\n" $data[1] = "2007/1/7\tjack993\tyeah!\n" $data[2] = "2007/1/8\thenry2007\tmessage\n" 為了要印出所有的內容,我們希望用for迴圈來做,所以會需要用到資料數,在這裡我們 使用count函式: $num_data = count($data); 此時,$num_data = 3。 最後我們寫入這樣的程式: <? echo "<table border=1>"; for( $i=0 ; $i<$num_data ; $i++ ) { $line = explode("\t",$data[$i]); echo "<tr>"; echo "<td>" . $line[0] . "</td>"; echo "<td>" . $line[1] . "</td>"; echo "<td>" . $line[2] . "</td>"; echo "</tr>"; } echo "</table>"; ?> 這段程式中,我們用echo輸出了一個表格,其中每一行都用一個for迴圈來寫。 注意的是其中的explode函式,它會將第二個引數的字串以第一個引數的字元作分隔,並 將其變成字串陣列回傳。所以當第一次回圈執行時,這行程式碼是: $line = explode("\t",$data[0]); 而此時的$data[0]則是 $data[0] = "2007/1/7\tjoehuang90\thello\n" 經過explode函式處裡之後,$data[0]被分成 "2007/1/7" "joehuang90" "hello" 這三個值會形成一個陣列並丟到$line變數,所以此時 $line[0]="2007/1/7" $line[1]="joehuang90" $line[2]="hello" 然後經由上面的程式印出在表格內。 因此,一個簡易的留言板可以寫成: (board.php) <html> <head></head> <body> <? $data = file("text.txt"); $num_data = count($data); if( $num_data=0 ) echo "No content is written."; echo "<table border=1>"; for( $i=0 ; $i<$num_data ; $i++ ) { $line = explode("\t",$data[$i]); echo "<tr>"; echo "<td>" . $line[0] . "</td>"; echo "<td>" . $line[1] . "</td>"; echo "<td>" . $line[2] . "</td>"; echo "</tr>"; } echo "</table>"; ?> </body> </html> 如果到目前都沒有問題,這份程式碼應該不會太難。 <字串> PHP通常最常處裡的資訊是字串,所以熟悉字串的一些操作是很重要的。 在C中,字串通常以" "雙引號表示,而字元則以' '單引號表示。PHP中,因為沒有字元 和字串的分別,通常" "跟' '都可以表示字串。 以下列出一些字串的常用函式: trim() ltrim() rtrim() 去除空白 這三個函式可以分別去除一字串起始或結尾的空白,trim同時去除頭尾的空白,ltrim 則去除起始的空白,rtrim則去除結尾的空白。 nl2br() 將字串中的\n改成<br> 這個函式會將字串中所有換行字元改顯示為<br>並直接輸出,所以等於是echo的加強版。 只要把字串放到這個函式,就等於會把它直接輸出成html。 printf() 格式化輸出 用法跟C完全相同。 strtoupper() strtolower() 字串改大寫/改小寫 字串的內容全部以大寫字母/小寫字母顯示。 explode(string seperator,string input) 分割字串 將字串以第一個引數為分隔字元,將第二個引數做分割,並傳回分割後的字串陣列。 implode(string seperator,string array) 合併字串 跟explode相反,這個函式把第二個引數的字串陣列用分隔字元來組回一個完整的字串。 substr(string input,int start,int length) 取出子字串 這個函式可以從第二個引數的數字開始,取第三個引數長度的子字串。例如: $str = substr("Merry Christmas",2,5); 會傳回"rry C"。 strcmp() 比較字串 同C的strcmp。 strlen() 求字串長度 同C的strlen。 strstr(string input,string target) 搜尋字串 同C的strstr,這個函式在第一個引數的字串中搜尋第二個引數的字串,如果成功的話則 傳回找到位置以後的字串,否則傳回false。例如: $str = strstr("Happy birthday","birth"); 會回傳"day"。 str_replace(string old,string new,string input) 取代子字串 這個函式會把第三個引數的字串中,所有包含第一個引數字串的部份替換成第二個引 數的字串,並回傳更改的字串。譬如: $str = str_replace("the","The","the weather is fine"); 會回傳"The weather is fine"。 <函式> 與C相同,PHP支援在程式碼中自建函式,也可以從外部include進函式。 不過,因為PHP通常都不指定型別,所以在PHP中的函式也不用指定型別。要宣告一個函 式的做法如下: function my_function() { } 內容的宣告法完全相同,如果要把函式寫在程式的下方也一樣得在程式開頭寫入原型。 如果要在函式中傳遞指標,則必須在參數前加上&,譬如: function my(&$value) PHP中,如果想要從外部來引入函式,只需要把函式寫在某個txt之類的文件檔,然後引 入就可以用了,不需要使用到標頭檔之類的東西。引入的方式有兩種:require()include()。 使用方法很簡單,就是require("text.txt"),然後該檔案的內容就會完全被寫到php裡, 取代掉該行文字。 require跟include用法相同,兩者只差在require函式讀檔錯誤時會是嚴重錯誤,而inclu de會是一般錯誤。 一般來說,這兩個函式的用處不只是引入函式庫。另一種用法是當網頁中有些區塊必須反 覆的出現,譬如說選單。則我們可以把輸出選單的php程式寫在txt裡面,然後在每個網 頁中用require將其引入。如此一來,不僅可以節省html碼的空間,也可以在選單做更改時 ,同步的更改所有的網頁。 譬如說,當我們的網頁有相同的一段頁首與頁尾,分別寫在header.inc和footer.inc,那 使用了require之後,每個網頁就只需要寫成: <? require("header.inc"); ?> html的內容 <? require("footer.inc"); ?> 當我們需要更改頁首根頁尾的內容的時候,所有的網頁就會自動的更新了。 ---------------------------------------------------------- 基本上PHP的說明就到這邊,剩下的東西基本上與C大部分也都雷同,或是不常用。 唯一還沒有講的東西可能是PHP的SQL資料庫操作,不過講了會變的非常複雜,也不好講解 ,有興趣的人可以自己查閱相關的資料。 如果目前的東西都學會了,相信應該已經有辦法自己寫出一個簡單的留言版了,加油吧! -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 59.121.14.228

01/07 22:41, , 1F
這位強者時間很多..普物跟微積分大概都看完了
01/07 22:41, 1F

01/07 23:03, , 2F
死台科 人家對大家好你還要酸人家
01/07 23:03, 2F

01/07 23:17, , 3F
$a = array( 'first'=>1 'second'=>2 'third'=>3 );
01/07 23:17, 3F

01/07 23:17, , 4F
是不是漏了逗號... = =":
01/07 23:17, 4F

01/07 23:24, , 5F
還有話說&$value那個東西應該叫"Reference" (總之隨便啦 xD)
01/07 23:24, 5F

01/08 00:00, , 6F
好文 但是建議要先把C學好 短期內其它的語言看看就好
01/08 00:00, 6F

01/08 00:19, , 7F
春神有所不知 這是作業呀 囧 超難的 沒碰過跟本不知道HOW
01/08 00:19, 7F

01/08 01:49, , 8F
的確漏了囧,補齊先
01/08 01:49, 8F
※ 編輯: joehuang92 來自: 59.121.14.228 (01/08 01:49)

01/08 20:40, , 9F
想必這位強者已經把C學的很好了XD
01/08 20:40, 9F
文章代碼(AID): #15eFcnqr (b95902HW)