---
title: PHP常用函數與自訂函數
tags: 泰職_前端網頁開發, CH03-04, 4H
date: 2019-10-18
---
# PHP常用函數與自訂函數
[TOC]
> [name=Loki Jiang][time=Wed, Jun 19, 2019 9:47 AM]
---
:::info
請開始在Web目錄下新增檔案 **2_array.php**,為了簡化程式碼結構將不建置HTML基本結構。請開始做PHP各種練習並預覽網頁結果。
:::
## 常用的函數(式)
php本身的函數非常多,譬如之前所用的`rand()`就是其中一種。同時常有重複的函數功能,譬如`mt_rand()`跟`rand()`。你不需要特別去背函式庫,只需要用到時就去查,慢慢常用的就會記住。
### phpinfo()
可以拿來查看PHP環境檢查上的確認。也是屬於比較私密的資料,不要放上網址讓知道你伺服器環境的弱點而被攻擊。
```php=
<?php
phpinfo();
?>
```
### rand(min,max)
會產生min~max之間的隨機整數,這裡不帶範例。
### array();
可以用array()函式快速建立一個陣列組合,多值用,分開。記得要用變數儲存。你也可以指定'索引'=>'內容'
```php=
//array()可以快速指定完整的陣列,記得用變數儲存
$ary1=array("加菲貓","凱蒂貓","湯姆貓");
$ary2=array(5=>"加菲貓","jp"=>"凱蒂貓","湯姆貓");
print_r($ary2);
print("<hr>");
/*
array相關的函數很多,這裡不一一列舉,你可以參考這裡:
http://www.w3school.com.cn/php/php_ref_array.asp
如果有用到再個別介紹
*/
```
### unset()
殺掉變數,可以殺掉一個完整變數,或是殺掉陣列內的某一格或整個陣列變數。你可以拿來跟指定變數=null做差異比較。
```php=
//unset() 可以殺掉變數
$var = 'hello world';
unset($var);
var_dump($var);
print("<hr>");
unset($ary2[5]); //根據前例子,殺掉加菲貓
var_dump($ary2);
//相對於變數等於null時,則是變數沒有內容,但變數存在
$var = 'hello world';
$var=null;
var_dump($var);
print("<hr>");
```
### date(format)
產生系統時間(以php.ini宣告的時區為主,預設GMT+0),format要填寫指定所需格式。參考網址[link>>時間格式](https://www.php.net/manual/en/function.date.php)
```php=
/*系統時間與日期*/
$now=date("Y-m-d H:i:s");
echo "現在系統時間為 ".$now."<br>";
```
如果此時要事後調整時區,比較直覺的作法是將時間往後推。透過hour+7的寫法。
```php=
/*系統時間與日期*/
$now=date("Y-m-d H:i:s");
echo "現在系統時間為 ".$now."<br>";
//date()可以根據想要的format(前面)去顯示,同時也能做增加減少(後面)但必須先把文字轉成時間語
$timelang=strtotime("+6 hours"); //你可以試著echo 這裡會得到一堆數字
$tw=date("Y-m-d H:i:s",$timelang); //台灣時間
echo "現在台灣時間為 ".$tw."<br>";
```
strtotime()能將字串指令變成時間代碼。提供時間與時間的數學加減計算。
### date\_default\_timezone_set()
直接告知網頁是以時區以哪個為主,這屬於比較正式的時區宣告。不是透過上面比較治標不治本的方法用調數字去補足。
```php=
date_default_timezone_set('Asia/Taipei');
echo "現在系統時間為 ".date("Y-m-d H:i:s"); //台灣時間
```
### ceil() && floor() && round()
無條件進位 && 無條件捨去 && 四捨五入,用在計算時使用
```php=
echo "10÷3=??<br>";
echo "ceil: ".ceil(10/3)."<br>";
echo "floor: ".floor(10/3)."<br>";
echo "round: ".round(10/3)."<br>";
```
### substr() && mb_substr()
擷取字串,能將一個文字串做擷取某部分出來。後者是針對中文的支援。
```php=
// substr 擷取字串
echo substr("abcdefg",2,3)."<br>";
echo mb_substr("不要打架要打去練舞室打",4,6);
```
### str_replace()
抽取某字串進行字串替換,不特別帶練習
### addslashes()
自動增加反斜線在特殊符號'"/之前綴,不特別帶練習
### md5()
md5加密,可以單向字串加密但無法反向解密,通常是對帳密認證之類做存取後兩者比對。
### chr()
查詢ASCII碼的字串值。通常用在程式連續產字的時候方便性。
```php=
//chr 轉為ascii code=> 0-9, a-z,A-Z = 48-57, 97-122, 65-90
echo chr(97); //a
```
練習:產生一組隨機密碼,由0-9, a-z,A-Z組成,密碼長度8~12
提示:你會需要用到rand,for,ifelse,chr
解答:
```php=
$num=rand(8,16);
for($i=0;$i<$num;$i++){
$word=rand(0,61);
if($word>35) echo chr($word+29);
elseif($word>10) echo chr($word+87);
else echo $word;
}
```
---
## 自訂的函式
你可以自訂一個函式,透過丟入返回完成任務達到獨立事件處理。
練習:跟著做,說話小程式
```php=
/*custom function*/
function say($who,$num){
echo $ai_say="hello ".$who."! ";
if($num>60) return "You are Great";
}
$name="Mark";
echo $msg=say($name,30);
// echo $ai_say; //error_sample
```
透過這個小範例有不少地方要注意:
1. 可以傳入變數,讓函式方便接著處理。
2. function的世界是獨立的,只能透過()或return傳遞資料,除了特別能力的變數。
3. 程式由右到左,所以你要能理解echo的執行觸發順序。
4. return可以不寫,如果你不需要回傳。
5. 有return情況下,外面程式也可以不理會。
自我練習:拿前面的密碼產生練習。
主程式提供彈性的數量值給副程式。由副程式產生對應數量的密碼給主。然後主程式把資料顯示出來。
解答:
```php=
function pwd($many)
{
for ($run = 1; $run <= $many; $run++) {
$num = rand(8, 16);
$code = "";
for ($i = 0; $i < $num; $i++) {
$word = rand(0, 61);
if ($word > 35) $code .= chr($word + 29);
elseif ($word > 10) $code .= chr($word + 87);
else $code .= $word;
}
$ary[] = $code;
}
return $ary;
}
$num = 5;
$result = pwd($num);
foreach ($result as $msg) {
echo $msg . "<br>";
}
?>
```
## 回家作業1
隨機1~100顆星星填滿你的畫面,每個星星的顏色大小隨機不同。
用到php=rand+for與HTML=DIV+style
高手挑戰
背景黑色,星星顏色偏向淺色系。讓星星透過css animate旋轉且速度不同。
## 回家作業2
大樂透電腦選號1 ~ 49,每次產生5 ~ 10組樂透號組,每組6個號碼不重複
用到array(),array_values(),sort(),for(),rand(),foreach();
:link: [View Full Code](https://gist.github.com/summer10920/ce630e2dd7fc44c369aef712e5a60b53)
<!-- :link: [View Homework Code]:(https://gist.github.com/summer10920/e072f56af28f5d2ebdeb45fa450208df) -->