PHP-Cookbook-chapte13

程式碼

//'13.1'擷取其他程式的輸出
$session_name = $session_txt['13.1'];
echo $session_name."<br>";
//echo ROOT_PATH."<br>";


$current_date = 'date';

$pp =popen('date','r');
while ($line = fgets($pp,1024)){
	$output .=$line;
}
pclose($pp);

show_array($output);
exec('date',$output_1);
print implode ("\n",$output_1)."<br>";  
show_array($output_1);

$message="
<fieldset><legend><font color=red>TIPS</font></legend>
   exec()函數。此函式會開啟一個管線連接到某個程式,並將該程式所有的輸出<br>
   逐行放到陣列中(欲填入的陣列當成第二個參數)。
   	
<br>
</fieldset>
";
echo $message."<br>";
//'13.2'印出程式的輸出
$session_name = $session_txt['13.2'];
echo $session_name."<br>";
//echo ROOT_PATH."<br>";

passthru('date');


$message="
<fieldset><legend><font color=red>TIPS</font></legend>
  passthru()函式 
<br>
</fieldset>
";
echo $message."<br>";

PHP-Cookbook-chapte9

程式碼

//'9.1'建立物件
$session_name = $session_txt['9.1'];
echo $session_name."<br>";
//echo ROOT_PATH."<br>";

class Name{
	var $property1;
	var $property2;
	
	function print_name($first_name,$last_name){
		print "You first name is :$first_name,<br>";
		print "and your last name :$last_name.";
	}
}

$obj = &new Name;
$obj->firstname='Oliver';
$obj->lastname='Butin';

$obj->print_name($obj->firstname,$obj->lastname); 


$message="
<fieldset><legend><font color=red>TIPS</font></legend>
    \$obj = &new Name;<br>
    \$obj->firstname='Oliver';<br>
    \$obj->lastname='Butin';<br><br>

     \$obj->print_name(\$obj->firstname,\$obj->lastname); 
<br>
</fieldset>
";
echo $message."<br>";
//'9.2'在類別裡存取變數
$session_name = $session_txt['9.2'];
echo $session_name."<br>";
//echo ROOT_PATH."<br>";

class Name1 {
	var $firstname;
	var $lastname;
	
	function print_name(){
		print 'Firstname :'. $this->firstname;
		print '<br>Lastname :'. $this->lastname."<br>";
	}

    function change_name ($name){
		$name = preg_split('/\s+/',$name);
		$this->firstname = $name[0];
		$this->lastname = $name[1];
	}

}

$obj = &new Name1;
$obj->change_name("Sterlling Hughes");
$obj->print_name();
$obj->change_name("Andrei Zmievski");
$obj->print_name();

$message="
<fieldset><legend><font color=red>TIPS</font></legend>
    取class的變數 \$this->firstname,不用加\$符號。
<br>
</fieldset>
";
echo $message."<br>";
//'9.4'設定公開和私有變數或函式
$session_name = $session_txt['9.4'];
echo $session_name."<br>";
//echo ROOT_PATH."<br>";

class Car {
	var $_name; // 私有變數
	var $brandname;
	
	function analyze(){
		if ($this->_name == "Corola"){
			$this->brandname = 'Toyota';
		}else {
			$this-_delete();
		}
	}
	function _delete(){
		$this->name ='';
		$this->brandname ='';
	}
}
	

$message="
<fieldset><legend><font color=red>TIPS</font></legend>
   如果要宣告函式和變數為類別所私有,你必須將它們放在函數內。<br>
   然而有個標準命名慣例,私有方法和變數應該有底線(_)開頭。
<br>
</fieldset>
";
echo $message."<br>";
//'9.5'撰寫建構函式(constructor)
$session_name = $session_txt['9.5'];
echo $session_name."<br>";
//echo ROOT_PATH."<br>";

class Human {
	var $name;
	
	function Human ($na){
		print "Wake up $na, you have been initalized!<br>";
		$this->name = $na;
	}
}
$obj = &new Human ('Stephen Hughes');


class SuperHuman extends Human {
	var $power;
	
	function SuperHuman($power){
		Human::Human(); //呼叫class Human 及 class 裡的 Human方法
		$this->$power = $power;
		print "You power is $power";
	}
	
	function user_power(){
	}
}
$obj1 = &new SuperHuman (10);
	

$message="
<fieldset><legend><font color=red>TIPS</font></legend>
  在PHP,建構函式是一個與類別名稱大小寫相同的函式,它可以接受參數<br>
  ,以便在初始化的時候讓物件有機會修改預設的資料。另外請注意,如果<br>
  親代類別也有一個建構函式,那麼當子類別產生物件時並不會呼叫親代的<br>
  建構函式。所以你必須手動作點工。<br>
  function SuperHuman(\$power){<br>
	<font color=red>
	Human::Human(); //呼叫class Human 及 class 裡的 Human方法
	</font>
	<br>
		\$this->\$power = \$power;<br>
		print 'You power is \$power';<br>
	}
	
<br>
</fieldset>
";
echo $message."<br>";
//'9.8'直接使用類別函式而不需產生物件
$session_name = $session_txt['9.8'];
echo $session_name."<br>";
//echo ROOT_PATH."<br>";

class Conversion {
	
	function feet_to_meters($feet){
		return $feet * 0.3054;
	}
}
$orgin_height = 6;
$average_height = Conversion::feet_to_meters($orgin_height);
print "輸入的$orgin_height 呎<br>";
print "換算成$average_height 公尺";

$message="
<fieldset><legend><font color=red>TIPS</font></legend>
    範例:原始碼<br>
	class Coversion {<br>
	function feet_to_meters(\$feet){<br>
		return \$feet * 0.3054;<br>
	   }<br>
}<br>
\$averge = Conversion::feet_to_meters(6);<br>
直接用符號::來用Conversion -class裡的方法feet_to_meters()<br>
也可以存取變數。
 
<br>
</fieldset>
";
echo $message."<br>";
//'9.9'直接存取親代類別的函式
$session_name = $session_txt['9.9'];
echo $session_name."<br>";
//echo ROOT_PATH."<br>";

class Computer {
	var $is_on = 1;
	
	function turn_on(){
		$this->is_on = 1;
		print "You turned me on";
	}
	
	function turn_off(){
		$this->is_on = 0;
		print "You turned me off";
	}
}

class HP extends Computer {
	var $processor = 0;
	var $hard_driver =0;
	
	function turn_on(){
		parent::turn_on();
		$this->processor = 1;
		$this->hard_drive = 1;
	}
	
	function turn_off(){
		$this->hard_drive = 0;
		$this->processor = 1;
		parent::turn_off();
	}
}

$message="
<fieldset><legend><font color=red>TIPS</font></legend>
    parent類別是個特殊類別,只能用::表示法存取。它可以讓你存取<br>
	親代類別的函式。
	
<br>
</fieldset>
";
echo $message."<br>";

PHP-Cookbook-chapte8

程式碼

//'8.5'在函式呼叫間維持變數值
$session_name = $session_txt['8.5'];
echo $session_name."<br>";
//echo ROOT_PATH."<br>";

function sequence_get_next_value()
{
		static $x =0;
		return $x++;
}

print sequence_get_next_value ()."=1st value <br>"; 
print sequence_get_next_value ()."=2nd value <br>";
print sequence_get_next_value ()."=3rd value <br>";


$message="
<fieldset><legend><font color=red>TIPS</font></legend>
     staric 變數 = 值,設定變數的維持值<br>
	 staic敘述是避免在函式中使用全域變數的良好方法。在PHP程式<br>
	 執行中,它會在函式間記得\$x的值,這表示程式執行完之後,PHP<br>
	 會忘記此靜態變數的值。
<br>
</fieldset>
";
echo $message."<br>";
//'8.8'動態建立匿名函式
$session_name = $session_txt['8.8'];
echo $session_name."<br>";
//echo ROOT_PATH."<br>";

function greet ($type){
	return create_function ('$greeting',
							"print \"$type:\$greeting <br> \";");
}
$greeting1 =greet("Casual");
$greeting2 =greet("Formal");

$greeting1("How's it going?");
$greeting1("What's up doc?");

$greeting2("Hello");
$greeting2("Hello,my name is Sterling, it is a pleasure to meet you."); 




$message="
<fieldset><legend><font color=red>TIPS</font></legend>
     create_function()函式,會動態建立一個函式,並以第一個參數當作<br>
	 該函式的參數,以第二個參數當作該函式的程式碼。它會傳回該函式名稱,<br>
	 然後你就可以呼叫該函式。這種粗糙的包裝形式有許多用途,包括call_back()<br>
	 函式。
<br>
</fieldset>
";
echo $message."<br>";
//'8.10'取得任意數量的參數
$session_name = $session_txt['8.10'];
echo $session_name."<br>";
//echo ROOT_PATH."<br>";

$input_record_separator = " ";

function perl_print (){
	$args =func_num_args();
	/*
	for ($idx = 0; $idx <$argc; $idx++){
		$current_arg = func_num_args($idx);
		print $current_arg.$input_record_separator;
	}
	*/
	foreach ($args as $arg){
		print $arg. $input_record_separator;
	}
}
function perl_print1 (){
	
	$argc =func_num_args();
	for ($idx = 0; $idx <$argc; $idx++){
		$current_arg = func_num_args($idx);
		print $current_arg.$input_record_separator;
	}
	
}

perl_print("Hello World \n","My Name is ","Sterling");
perl_print1("Hello World \n","My Name is ","Sterling","234");

$message="
<fieldset><legend><font color=red>TIPS</font></legend>
   PHP提供一組方便的函式,可接受任意數量的參數。func_num_args()   
<br>
</fieldset>
";
echo $message."<br>";

PHP-Cookbook-chapter7

程式

//'7.1'處理時間標記
$session_name = $session_txt['7.1'];
echo $session_name."<br>";
//echo ROOT_PATH."<br>";

$fn = $file_name = ROOT_PATH."/test/6-10.txt";

print "$fn was last accessed on:". fileatime ($fn)."<br>";
print "$fn was last change on:". filectime ($fn)."<br>";
print "$fn was last modified on:". filemtime ($fn)."<br>";

if (touch ($fn,$date)){
	print "Timestamp changed....";
}else{
	print "Modification Failed";
}

$message="
<fieldset><legend><font color=red>TIPS</font></legend>
   在PHP中,copy()是更改檔案時間標記的唯一方式,而它唯一變更<br>
   的是檔案修改時間。因此,除非你用exec(),system()跳出PHP之外<br>
   ,否則你只能更改檔案的mtime。
   
<br>
</fieldset>
";
echo $message."<br>";
//'7.2'移除檔案
$session_name = $session_txt['7.2'];
echo $session_name."<br>";
//echo ROOT_PATH."<br>";


$message="
<fieldset><legend><font color=red>TIPS</font></legend>
   用unlink()函式處理你要刪除的檔案。若成功傳回1,否則傳回0。<br>
   因此你可以用or運算子或if-else區塊。<br>
   如果你想刪除數個檔案,你可以用forch迴圈讀取陣列元素,然後<br>
   刪除每個檔案。<br>
   foreach (\$file as \$file){ <br>
        unlink(\$file); <br>
		or die ('Waring str');<br>
   }
<br>
</fieldset>
";
echo $message."<br>";
//'7.3'拷貝或移動檔案
$session_name = $session_txt['7.3'];
echo $session_name."<br>";
//echo ROOT_PATH."<br>";


$message="
<fieldset><legend><font color=red>TIPS</font></legend>
   在PHP中,copy()函式<br>
   if (copy(\$orginal,\$new)){<br>
      print '成功'; <br>
   }else{  <br>
		print '失敗'; <br>
   }  <br>
   或者如果你需要移動檔案,就用rename()函式 <br>
   rename(\$original,\$new) <br>
      or die ('warmingstr')
<br>
</fieldset>
";
echo $message."<br>";
//'7.5'分析檔名的各個組成部分
$session_name = $session_txt['7.5'];
echo $session_name."<br>";
//echo ROOT_PATH."<br>";

$fn = ROOT_PATH."/test/6-11.php";

$pinfo = pathinfo ($fn);
print "Directory name is :".$pinfo [dirname ] ."\n<br>";
print "Filename is :".$pinfo [basename ]." \n<br>";
print "Ending is :".$pinfo [extension ]." \n<br>";




$message="
<fieldset><legend><font color=red>TIPS</font></legend>
     參數 dirname 檔案位在的目錄<br>
     參數 basename 檔案名稱<br>
     參數 extension 檔案副檔名,若它有的話
<br>
</fieldset>
";
echo $message."<br>";
//'7.8'循序處裡目錄中的檔案
$session_name = $session_txt['7.8'];
echo $session_name."<br>";
//echo ROOT_PATH."<br>";

$dir_name = ROOT_PATH."/test";
$dh = dir ($dir_name);
echo "方法一<br>";
while ($entry = $dh ->read()){
	print $entry ."\n";
}
$dh->close();

$dh = opendir ($dir_name);
echo "<br>方法二<br>";
while ($entry = readdir ($dh)){
	print $entry ."\n";
}
closedir();

$message="
<fieldset><legend><font color=red>TIPS</font></legend>
    你可以用dir()函式透過一虛擬的物件處裡目錄或用opendir()<br>
	、readdir()、和closedir()來讀取目錄。
 	 
<br>
</fieldset>
";
echo $message."<br>";

PHP-Cookbook-chapter6

程式

//'6.3'建立暫存檔
$session_name = $session_txt['6.3'];
echo $session_name."<br>";
//echo ROOT_PATH."<br>";

$tmp = tempnam (ROOT_PATH."/test","tmpFile");

$fp = @fopen ($tmp,"w");
if (!@fp){
	die ("無法開啟 $tmp");
}

fputs ($fp,"Hello World <br>");
fputs ($fp,"Another Line in a Temporary File");

@fclose ($fp);

$fp =@fopen ($tmp, "r");
if(!$fp){
	die ("無法開啟 $tmp");
}

while ($line = @fgets ($fp,1024)){
	print $line;
}
@fclose ($fp);
@unlink ($tmp)
or die ("無法刪除 $tmp");

	
$message="
<fieldset><legend><font color=red>TIPS</font></legend>
   tempnam(位置,前綴詞)函式會在指定的目錄下產生一個指定<br>
   前綴詞唯一檔。檔案建立後,會傳回檔名(本例指定給\$tmp_file_name)<br>
   ,程式節結束後,記得用unlink()刪除檔案。
   
<br>
</fieldset>
";
echo $message."<br>";
//'6.4'將檔案存到程式裡
$session_name = $session_txt['6.4'];
echo $session_name."<br>";
//echo ROOT_PATH."<br>";

$file_name = ROOT_PATH."/test/3-1.txt";
$fp = @fopen ($file_name,"rb") or
	die ("無法開啟{$file_name}");

clearstatcache(); //清除快取

$f_contents = fread ($fp,filesize ($fp)); //方法一
//echo $f_contents; 

unset ($f_contents);
$f_contents = show_array(file ($file_name));//方法二

unset ($f_contents);
$f_contents = implode ("",file ($file_name));//方法三
echo $f_contents."<br>";

unset ($f_contents);
while ($line = @fgets ($fp,1024)){  //方法四
	$f_contents .=$line; 
}
echo $f_contents;

@fclose ($fp);

$message="
<fieldset><legend><font color=red>TIPS</font></legend>
    fread()讀取資料,並搭配filesize(),將檔案載入變數中<br>
	如果想把檔案一行一行存入陣列,就用file()函式。<br>
	另外要使用filesize()時,最好用clearstrstcache()清除快取。
<br>
</fieldset>
";
echo $message."<br>";
//'6.8'鎖定檔案
$session_name = $session_txt['6.8'];
echo $session_name."<br>";
//echo ROOT_PATH."<br>";

/*
Lockfile.inc
<?
function lock ($fp,$lock_level=LOCK_EX){
	@flock ($fp,$lock_level)
	or die ("無法以 $lock_level 鎖定檔案指標");
}
function unlock ($fp){
	@flock ($fp,LOCK_UN)
	or die ("無法解除鎖定");
}
?>
*/
include ("Lockfile.inc");

unset ($file_name);
$file_name = ROOT_PATH."/test/3-1.txt";

$fp = @fopen ($file_name,"wb")
		or die ("無法開啟 $file_name 以供寫入");

//寫入檔案前請務必取得獨佔鎖定(exclusive)
//這相當於 flock($fp,LOCK_EX)
lock ($fp);

fwrite ($fp,"Hello");

//解除檔案鎖定,這相當於 flock($fp,LOCK_UN)
unlock ($fp);
@fclose ($fp);



$message="
<fieldset><legend><font color=red>TIPS</font></legend>
    你想確保存檔案期間不會有其他程式存取,使用flock()函式<br>
	參數為 LOCK_EX 鎖定、LOCK_UN 解除鎖定
<br>
</fieldset>
";
echo $message."<br>";
//'6.10'顯示文字檔內容
$session_name = $session_txt['6.10'];
echo $session_name."<br>";
//echo ROOT_PATH."<br>";

$read_file = ROOT_PATH."/test/6-10.txt";
$fp = @fopen ($read_file,"rb")
		or die (" Cannot read the $read_file !");
$twenty_byes = fread ($fp,20);
fpassthru($fp);

echo "<br>";

readfile ($read_file);

echo "<br>";

print implode ("<br>",file ($read_file));



@fclose ($fp);

$message="
<fieldset><legend><font color=red>TIPS</font></legend>
  有三個函式可以讀取文字檔內容。fpassthru()、readfile()、<br>
  implode(\"區隔符號\",file(檔案位置))
<br>
</fieldset>
";
echo $message."<br>";
//'6.22'隨機排列檔案內容
$session_name = $session_txt['6.22'];
echo $session_name."<br>";
//echo ROOT_PATH."<br>";

$fn = ROOT_PATH."/test/6-10.txt";
$reg_array = file($fn);

srand ((double)microtime()*1000000);
shuffle ($reg_array);

$fp = @fopen($fn,"wb") or die ("無法開啟檔案 $fn");
	fputs ($fp,implode ("",$reg_array));

echo "<br>以下是亂數排列後的內容:<br>";	
readfile ($fn);
echo "<br>";


$fn1 = ROOT_PATH."/test/6-11.txt";
srand ((double)microtime()*1000000);
$fp1 = @fopen($fn1,"rb") or die ("無法開啟檔案 $fn");
foreach (file ($fn1) as $line){
	$words = preg_split ("/\s+/",$line);
	shuffle ($words);
	$data .= implode ("",$words."\n");
}

print "herd".$data; //有問題出不來

@fclose ($fp1) or die ("無法關閉檔案 $fn");
@fclose ($fp) or die ("無法關閉檔案 $fn");

$message="
<fieldset><legend><font color=red>TIPS</font></legend>
  首先用file()函式將檔案載入陣列,現在陣列中已經有檔案的每一行<br>
  內容,我們就可以將陣列個元素隨機排列。接著我們可以為shuffle()<br>
  設定亂數產生器的起點,然後將陣列傳給shuffle()(請注意不需要<br>
  shuffle()的傳回值,因為它直接操控陣列本身。
<br>
</fieldset>
";
echo $message."<br>";

PHP-Cookbook-chapter5

程式

//'5.1'指定樣式替換的結果
$session_name = $session_txt['5.1'];
echo $session_name."<br>";


	
$message="
<fieldset><legend><font color=red>TIPS</font></legend>
   PHP的常規表示式並不影響到他們所處理的字串內容,而是根據所給的<br>
   樣式和字串傳回一新的字串,因此需要一個新的變數來接它。
   
<br>
</fieldset>
";
echo $message."<br>";
//'5.9'檢驗網頁傳送的資料
$session_name = $session_txt['5.9'];
echo $session_name."<br>";

@exec (escapeshellcmd ($input),$output);

if (!@empty ($name)){
	die ("You have to supply Your name");
}
	
$message="
<fieldset><legend><font color=red>TIPS</font></legend>
   exec (esecapeshellcmd (\$input),\$output)會跳脫所有的<br>
   shell萬用字元,讓使用者輸入的內容無法危害你的系統安全。<br>
   empty()函式只檢查有沒有值,不會檢查是否為有效值。
   
<br>
</fieldset>
";
echo $message."<br>";
//'5.12'檢查重複的字
$session_name = $session_txt['5.12'];
echo $session_name."<br>";

$seen = array();
$paragraph ="The ugly lady chased the handsome man";
$paragraph =preg_split("/\s+/",$paragraph);

foreach ($paragraph as $word){
	@$seen [strtolower ($word)]++;
}
$seen = show_array($seen);
print "There were $seen [the] occurrences of the word 'the' <br>";

function get_dupes ($str){
	$str = strtolower ($str);
	$words = preg_split ("/\s+/",$str);
	$seen = array();
	$start_pos = array();
	$i = 0;
	
	foreach ($words as $word){ //取字串的迴圈
	    //二維的陣列,包含單字的位置
		@$seen [$word][$i] = strpos ($str,$word,$start_pos [$word]);
		//指定起始位置以避免重複
		$start_pos [$word] = $seen [$word][$i] +strlen ($word);
		$i++;
	}
	return ($seen);
}
$str = " The The the Hello Truck Hello The the Jester Rye";
echo $str."<br>";
$duplicates = get_dupes ($str);
var_dump ($duplicates); //印出陣列的相關訊息

	
$message="
<fieldset><legend><font color=red>TIPS</font></legend>
    var_dump()印出陣列的相關訊息<br>
	strtolower()將字串轉成小寫<br>
    strpos()找出字串首次出現的位置<br>
	strlen()字串的長度
<br>
</fieldset>
";
echo $message."<br>";
//'5.13'減少輸入的需要
$session_name = $session_txt['5.13'];
echo $session_name."<br>";

function do_function ($option){
	switch ($option){
		case "Sent";
			print "Sent";
			break;
		case "Delete";
			print "Deleted";
			break;
		case "Open Mail";
			print "Mail Opened";
			break;
		case "Read Message";
			print "Message Read";
			break;
		case "Reply-to Message";
			print "Reply-to Message";
			break;
	}
}

$mappings = array ( "S" => "Send",
					"D" => "Delete",
					"R" => "Read Message",
					"T" => "Reply-to message");
					
$input = "do something";
do_function ($mappings [strtoupper (substr ($input,0,1))]);

	
$message="
<fieldset><legend><font color=red>TIPS</font></legend>
   strtoupper()轉換為大寫<br>
   substr(\$input,0,1)取字串,從0開始,取1個字元
<br>
</fieldset>
";
echo $message."<br>";

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>";

PHP-Cookbook-chapter1

程式

<?php
//1.1字串剖析 strpos()
$email = 'sterling@php.net';
$user_name = substr ($email,0,strpos($email,'@'));
echo $user_name."<br>";

//1.1字串剖析 unpack()
$str = "Gumbi and PDOC are smelly";
$names = unpack("A5name1/x5/A4name2", $str);
echo $names['name1']."<br>".$names['name2']."<br>";

//1.1字串剖析 unpack()
$str2 = 'A box without hinges, key, or lid, Yet golden treasure inside is hid';
$results = unpack ("A1pronoun/x5/A7adjective/X11/A3noun", $str2);
foreach($results as $key => $value){
      echo "{$key}: =>{$value} <br>";


 
}
//1.3交換變數  list()
$items = array ( "Linux",
		 "Apache",
		 "PHP",
		 "A SQL Server",
		 "Talented Administrator");
print "The essentials for operating your own webserver:\n";

reset ($items);
while (list (, $item) = each ($items)){
		print "$item\n";
}
//1.4將ASCII碼轉換為字元
$letter = chr(67);
$ascii_code = ord ($letter);
$letter = sprintf ("%c",$ascii_code);
echo "<br>{$letter}<br>";
//1.5劃分字元
function str_ord ($str){
	for ($i = 0; $i < strlen ($str); $i++){
	$ascii_values[$i] = ord ($str[$i]);
	}
    return $ascii_values;
}	

$str = "Hello World";
$ascii_values = str_ord ($str);
print "The third letter of \$str, a-> $str[2],";
print "has an ASCII value of $ascii_values[2].<br>";

$ascii_values = unpack ("C*char", $str);
//key char
$ascii_values2 = array_values (unpack("C*char", $str));
//轉換key 0,1...
foreach($ascii_values as $key => $value){
      echo "{$key}: =>{$value} <br>"; 
}
foreach($ascii_values2 as $key => $value){
      echo "{$key}: =>{$value} <br>";
}
//1.6 反轉部分字串 array_reverse是反轉單字字串  strrev是反轉字元
function word_reverse ($str){
	return implode ("",array_reverse (preg_split ("/\s+/",$str)));
}
$str = "A ross by any other name ";
print $str."<br>";

$str_reversed = word_reverse($str);
print $str_reversed."<br>";

$chart_reverse = strrev ($str);
print $chart_reverse."<br>";
//1.8 移除字串中的空白 chop 去除尾部空白 ltrim 去除開頭空白 trim 去除頭尾空白
$str = "red apple     " ;
$str = chop ($str);
echo $str."abc<br>";
$str = "   red apple     " ;
$str = ltrim ($str);
echo "abc".$str."abc<br>";
//1.11 解析URL
$session_name = "1.11 解析URL";
echo $session_name."<br>";

$url = 'http://www.php.net/search.php?show=nource&';
$url .='patter=parse_url&sourceurl=http%3A%2F%2Fwww.php.net%2F ';
$url_parts = parse_url ($url);
foreach ($url_parts as $key =>$value ){
	echo "{$key} => {$value} <br>";
}
//1.14 對字串加密
$session_name = "1.14 對字串加密  支援md5() base64_encode() base64_decode()";
echo $session_name."<br>"; 
/*  無法支援mcrypt
$key = "Sterling Hughes ";
$string = "Hello World" ;
$encrypted = mcrypt_ecb (MCRYPT_TripleDES, $key ,$string, mcrypt_encrypt);
$decrypted = mcrypt_ecb (MCRYPT_TripleDES, $key ,$string, mcrypt_decrypt);
echo $encrypted."<br>";
echo $decrypted."<br>";
*/
/*
$key = pack('H*', "bcb04b7e103a0cd8b54763051cef08bc55abe029fdebae5e1d417e2ffb2a00a3");
$key_size = strlen($key);
echo "key size: ".$key_size."<br>";
$string = "Hello World" ;
$iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC);
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
$ciphertext = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key,
                                 $string, MCRYPT_MODE_CBC, $iv);
$ciphertext = $iv . $ciphertext;
$ciphertext_base64 = base64_encode($ciphertext);
echo  $ciphertext_base64 . "\n";
*/
$data = "Thanks for this idea Zak!";
$hashed_data = md5 ($data);
print "The md5 hash of $data is $hashed_data ";

$data = "Hello World";
$hashed_data = md5 ($data);
print "The md5 hash of $data is $hashed_data <br> ";

$base63_data = base64_encode ($data);
print "The base64_encode hash of $data is $base63_data <br> ";

$decode_data = base64_decode($base63_data);
print "The base64_decode hash of $base63_data is $decode_data <br> ";