PHP-Cookbook-chapter4

程式

//'4.1'使用檔案常數
$session_name = $session_txt['4.1'];
echo $session_name."<br>";

//require_once 'DB.php';

function ferror( $file,
				 $line,
				 $message = 'General Error'){
	$errmsg = "There was an error in script $file,on $line :$message \n";
	error_log($errmsg);
	die ('An error occurred, it has been logged in the system log');
				 }

//$dbh = DB::connect("mysql://user:secret@localhost/dbname");
//if (!$dbh){
	//$dbh = @ferror(__FILE__,__LINE__,sprintf('[%d]:%s'),
	//$dbh->getCode(),$dbh->getMessage());
//}
	
$message="
<fieldset><legend><font color=red>TIPS</font></legend>
   此函式,它從使用者端接受參數\$file、\$line、和\$message,並<br>
   經過格式美化之後印出,使結果較容易閱讀。我們也為\$message指定<br>
   一個預設值,以便可以忽叫此函式時省略\$message這個參數。
<br>
</fieldset>
";
echo $message."<br>";
//'4.2'PHP的作業系統和版本常數
$session_name = $session_txt['4.2'];
echo $session_name."<br>";

switch (PHP_OS){
	case "WIN32";
		//win32_function();
		break;
	case "Linux";
		//linux_function();
		break;
	case "OS/2";
		//os2_function();
		break;
}

//error_reporting(E_WARNING);
//PHP_OS ="Linux";
if (!defined(PHP_OS)){
	//die ("OS Detection cannot be done automatically");
}
		
	
$message="
<fieldset><legend><font color=red>TIPS</font></legend>
   當你想寫出一個大小通吃的程式而又不知道作業系統版本時就很有用。
<br>
</fieldset>
";
echo $message."<br>";
//'4.3'用PHP的錯誤常數設定中斷點
$session_name = $session_txt['4.3'];
echo $session_name."<br>";

error_reporting(E_WARNING);
$line = "The \nQuick \nYoung \nProgrammer \nJumped \nOver \nThe
         \nLazy \nOld \nProgrammer";
$line = ereg_replace ("(\n"," ",$line);//mis-matched parentheses
print $line."<br>";


$message="
<fieldset><legend><font color=red>TIPS</font></legend>
   在程式裡,ereg_replace(),第一個參數的常規表示少了一個小括號<br>
   。通常PHP不會回報這個錯誤,但因為我們透過error_reporting()<br>
   呼叫PHP回報常規表示的錯誤,所以現在就會收到錯誤的回報。
<br>
</fieldset>
";
echo $message."<br>";
//'4.4'定義自己的PHP常數
$session_name = $session_txt['4.4'];
echo $session_name."<br>";

define ("HI","Hello World");
print HI."<br>";

/*
function four (){
	return 4;
}
define ("HI","four()");
print HI;
*/

if (!defined ("FIVE"))
	@defined ("FIVE","five");
else
	return;

print FIVE;



$message="
<fieldset><legend><font color=red>TIPS</font></legend>
   此程式用defined()函式定義HI為Hello World。
</fieldset>
";
echo $message."<br>";
/'4.5'PHP的全域變數
$session_name = $session_txt['4.5'];
echo $session_name."<br>";
unset ($message);

reset ($GLOBALS);
while (list($key,$var) = each ($GLOBALS)){
	print "$key =>$var \n<br>\n";
}



$message="
<fieldset><legend><font color=red>TIPS</font></legend>
  此範例使用PHP的list()和each()函式來處理\$GLOBALS陣列。
</fieldset>
";
echo $message."<br>";

PHP-Cookbook-chapter3

程式

//'3.1'陣列宣告
$session_name = $session_txt['3.1'];
echo $session_name."<br>";

$message="
<fieldset><legend><font color=red>TIPS</font></legend>
   我們用到serialize()函式,它會以字串形式傳回某一變數內容,並
   將該字串寫入檔案。在load_data()函式中,我們用implode()和file
   ()將檔案中代表變數的內容字串讀出,並放到\$data變數內。再用
   unserialize()函式將資料轉回原來的變數並傳回來。
<br>
</fieldset>
";
//'3.2' 印出陣列內容
unset ($message); //清空
unset ($session_name);
$session_name = $session_txt['3.2'];
echo $session_name."<br>";


$list = array ("Emily","Jesse","Franklin","Chris");
print substr (implode (',',$list),0);



$i = 0;
while ($i <count($list)){
	print $list[$i++]."<br>";
}
$message="
<fieldset><legend><font color=red>TIPS</font></legend>
   implode()函式會在每個陣列元素後插入逗號,並傳回一個字串,
   接著我們用substr()函式去除逗號。
<br>
</fieldset>
";
echo $message."<br>";
//'3.3' 除去相同的陣列元素
unset ($message); //清空
unset ($session_name);
$session_name = $session_txt['3.3'];
echo $session_name."<br>";

//$unique = array_unique ($dupllicates);

$n_array = array (1 =>"<br>//'3.1'陣列宣告",
		   2 =>"<br>//'3.2' 印出陣列內容",
		   3 =>"<br>//'3.3' 除去相同的陣列元素"
			);
foreach ($n_array as  $element){
	
	if (@$tstarray [$element] <3){
		array_push ($n_array,$element);
		@$tstarray [$element]++;
	}
}

$message="
<fieldset><legend><font color=red>TIPS</font></legend>
   你想取出陣列中唯一的元素,並去除相同的 array_unique()<br>
   另外會出現 Undifine index Undefined variable 對於<br>
   \$tstarray變數,加上@在\$tstarray前方,就不會出現。
<br>
</fieldset>
";
echo $message."<br>";
//'3.4' 擴大或縮小陣列
unset ($message); //清空
unset ($session_name);
$session_name = $session_txt['3.4'];
echo $session_name."<br>";

$list = array ("dog","cat","rabbit","ant","horse","cow");
array_splice ($list,5);

foreach ($list  as $key => $value){
      
	  echo "{$key}: =>{$value} <br>"; //方法一
	 
}

for ($i=0; $i<=count($list);$i++){
	
		  echo @$list[$i]."<br>";   //方法二

}
$message="
<fieldset><legend><font color=red>TIPS</font></legend>
  縮小陣列的大小,本來是50個(PHP4),用array_splice(),去切
<br>
</fieldset>
";
echo $message."<br>";
//'3.5' 合併陣列
unset ($message); //清空
unset ($session_name);
$session_name = $session_txt['3.5'];
echo $session_name."<br>";

$good_guys =array ("Gandalf","Radagast","Sarauman");
$bad_guys =array ("Nazgul","Sauron","Orcs");

//$all_guys = array_merge ($good_guys,$bad_guys);
$all_guys = array_merge_recursive ($good_guys,$bad_guys);
//$all_guys = $good_guys + $bad_guys; 使用+不行


$good_guys = show_array($good_guys);
$bad_guys = show_array($bad_guys);
$all_guys = show_array($all_guys);

$message="
<fieldset><legend><font color=red>TIPS</font></legend>
  使用array_merge()去合併多個陣列,用array_merge_recursive()也可以。
<br>
</fieldset>
";
echo $message."<br>";
//'3.6' 反覆處理陣列元素
unset ($message); //清空
unset ($session_name);
$session_name = $session_txt['3.6'];
echo $session_name."<br>";

function ascii_codes (&$element){
	$element = ord ($element);
}

$nice_line ="What Up everyone ";
$chars = preg_split ("//",$nice_line);
array_walk ($chars,'ascii_codes');

show_array($chars);

function ascii_codes1 (&$element1){
	$element1 = ord ($element1);
}

$nice_line1 ="What Up everyone ";
$chars1 = preg_split ("//",$nice_line1);
for ($i = 0; $i < count ($chars1); $i++){
	$chars1 [$i ] = ascii_codes1($chars1[$i]);
}
//array_walk ($chars1,'ascii_codes1');
//show_array($chars1);

$message="
<fieldset><legend><font color=red>TIPS</font></legend>
   array_walk(),參數 (變數,'函數')。空白的ascii_code=32<br>
   這邊較留意的是變數前加&符號,稱為以指標傳遞。<br>
   不過有個要注意的是,使用物件時,此時應該永遠以指標傳遞。
<br>
</fieldset>
";
echo $message."<br>";
//'3.7' 存取陣列內不同區域
unset ($message); //清空
unset ($session_name);
$session_name = $session_txt['3.7'];
echo $session_name."<br>";

$message="
<fieldset><legend><font color=red>TIPS</font></legend>
    array_slice(變數,n,n),例如array_slice(\$mash_cast,2,2)<br>
	取變數\$mash_cast,第三個取兩個
<br>
</fieldset>
";
echo $message."<br>";


//'3.11'隨機排列陣列中的元素 
unset ($message); //清空
unset ($session_name);
$session_name = $session_txt['3.11'];
echo $session_name."<br>";

srand ((double)microtime()*1000000);
$some_array = range(1,52);
shuffle($some_array);
echo $some_array[0]."<br>";


$message="
<fieldset><legend><font color=red>TIPS</font></legend>
    使用shuffle()函式,隨機改變次序
<br>
</fieldset>
";
echo $message."<br>";
//'3.13'陣列排序 
unset ($message); //清空
unset ($session_name);
$session_name = $session_txt['3.13'];
echo $session_name."<br>";

function cmp_debt ($a,$b){
	if ($a [1] == $b[1]) return 0;
	return ($b [1] >> $a [1]) ? 1 : -1;
}

$buddy_debts = array(array ("John",31),
				     array ("Dave",12),
					 array ("Kris",15),
					 array ("Werner",38),
					 array ("Phil",9));
usort ($buddy_debts,'cmp_debt');
foreach ($buddy_debts as $buddy_debt){
	print $buddy_debt [0]."Owes".$buddy_debt [1];
	print "<br>";
}


$message="
<fieldset><legend><font color=red>TIPS</font></legend>
    usort()函式接受一個陣列,並以使用者自訂的函式來排列
<br>
</fieldset>
";
echo $message."<br>";

PHP-Cookbook-chapter2

程式

//2.1檢查變數值是否為有效數字 
$session_name = "2.1檢查變數值是否為有效數字  ";
echo $session_name."<br>";
// is_int -> 檢查整數, is_float->檢查浮點數字, is_numeric->檢查字串裡為數字
$num1 = 'test';
if (is_float ($num1) || is_int($num1)) {
	print '$num1 是數字 <br>';
}elseif (is_numeric ($num1)){
	print '$num1 可能不是數字,但其內容為數值<br>';
}else {
	print '$num1 既不是數字,也非數值字串<br>';
}
//2.2處理一連串數字
$session_name = "2.2處理一連串數字  ";
echo $session_name."<br>";
$x =10;
$y =20;

for ($i = $x; $i <= $y; $i++){
	//$i 將會是$x到$y之間的整數
	print "$i \n";
}


$items = array ( "Linux",
				 "Apache",
				 "PHP",
				 "A",
				 "SQL",
				 "Server",
				 "Talented",
				 "Administrator");
				 
for ($i = 2; $i <=6; $i++){
     print "$items[$i]<br>";
}
//2.10 設定數字輸出格式  number_format		
$session_name = "2.10 設定數字輸出格式 ";
echo $session_name."<br>";
$num = 12500000.8356;
$num = number_format($num,2); //取到小數2位
print "$num<br>";
//2.11弧度與角度的轉換
$num1 = 90;
$num2 = 3.14;

$rad = deg2rad ($num1);
$deg = rad2deg ($num2);
print "角度 $num1 轉成弧度為 $rad <br>";
print "弧度 $num2 轉成角度為 $deg 度 <br>";
//2.13產生亂數
$session_name = "2.13產生亂數 ";
echo $session_name."<br>";

$items = array ( "Linux",
				 "Apache",
				 "PHP",
				 "A",
				 "SQL",
				 "Server",
				 "Talented",
				 "Administrator");

$rand_num = mt_rand(0,count ($items)-1);

print "rand items =>$items[$rand_num]";
// 2.14產生一個唯一的隨機數字  用檔案  @->忽略錯誤
$session_name = "<br>##2.14產生一個唯一的隨機數字  用檔案  ";
echo $session_name."<br>";

mt_srand ((double)microtime()*1000000);

$data = implode ("",file ('random_numbers.txt'));
$random_numbers = $data ? unserialize ($data) : array ();

$random =mt_rand();
while (@in_array ($random_numbers,$random));
	$random = mt_rand();
@array_push ($random_numbers,$random);

$data = serialize ($random_numbers);
$fp = fopen ("random_numbers.txt",'w');
if (!$fp){
	die ("Cannot open random_numbers.txt");
}
@fwrite ($fp,$data);
@fclose ($fp);

print "$random  為首次產生";
//2.15 亂數加權
$session_name = "<br>##2.15 亂數加權  ";
echo $session_name."<br>";
$ads =  array ( "Linux" => 1,
				"Apache" => 1,
				"PHP" => 3,
				"A" => 1,
				"SQL" => 4,
				"Server" => 10,
				"Talented" => 1,
				"Administrator" => 4
					);
$j = 0;

foreach ($ads as $company => $weight){
	for ($i = 0 ; $i < $weight ; $i++){
		$dist [$j++] = $company;
		//$j."<br>";
	}
     //echo $j."<br>";	
}
srand((double)microtime()*1000000);
$rand_num = mt_rand(0,$j -1);
@shuffle($dist); //隨機排列陣列元素

$company = $dist [$rand_num ];
print "選擇的公司是:$company<br>"; 
//2.16 將今天日期載入陣列中
$session_name = "<br>##2.16 將今天日期載入陣列中  ";
echo $session_name."<br>";
$da = getdate();
$date = "$da[mon]/$da[mday]/$da[year]";
print $date."<br>";

$datestamp = date ("j/n/Y");
print $datestamp."<br>";

list ($month,$day,$year) = explode ('/',$date);
if (checkdate ($month,$day,$year)){
	print "有效日期<br>";
}else{
	print "無效日期<br>";
}

echo "<br>--------- 日期格式: 月 / 日 / 年  ex:09/06/2024 2024年9月6日 ------<br>";

$check_date = "13/06/2024";
$check_str = is_valid_date($check_date);

echo "$check_date<br>";

$check_str= ($check_str==1) ? "是" : "否";
echo "$check_str<br>";


function is_leap_year($year){
	return ((($year%4)==0 &&($year%100)!=0)||($year%400)==0);
}
function is_valid_date ($date){
	// 把日期拆開
    list($month,$day,$year)=explode ('/',$date);
	$month_days =array(31,28,31,30,31,30,31,31,30,31,30,31);
	
	if ($month <1 || $month >12)
		return false;
	
	//年必須包含四位數字
	if ((strlen($year)!=4) || eregi("[^0-9]",$year))
		return false;
	
	//若是閏年,二月將有29天
	if (is_leap_year($year))
		$month_days [1] == 29;
	
	if ($day < 1 || $day > $month_days [$month-1] )
		return false;
	
	return true;
}
/2.22效能測試
$session_name = "<br>##2.22效能測試  ";
echo $session_name."<br>";

function get_microtime()
{
	$mtime = microtime();
	$mtime = explode(" ",$mtime);
	$mtime = doubleval($mtime[1 ])+doubleval($mtime[0 ]);
	return ($mtime);
}
$time1 = get_microtime();

for ($i=0; $i<99999; $i++){
	$ar []=$i;
}
$time2 = get_microtime();
$diff = abs ($time2-$time1);

print "<br>For 迴圈:$diff 秒<br>";

$i  =0;
unset ($ar);
$time1 = get_microtime();
while ($i<99999){
	$ar [] = $i;
	$i++;
}
$time2 = get_microtime();
$diff = abs ($time2-$time1);

print "<br>For 迴圈:$diff 秒<br>";