分類彙整:php

date.timezone

PHP 5開始,date.timezone 一開始是未設置,所以在使用date相關的函式的時候,時間會對不起起來,因此必須去設定date.timezone的值,

1.使用php.ini

[Date]
;date.timezone =

改為
[Date]
date.timezone = “Asia/Taipei”

將前面的冒號 ; 拿掉,然後重新啟動apache。

 

2.使用 php function

php的檔案內,增加一行設定,
date_default_timezone_set(“Asia/Taipei”)

PHP array的extract

資料來源
http://php.net/manual/en/function.extract.php
http://www.w3school.com.cn/php/func_array_extract.asp

/* Suppose that $var_array is an array returned from   wddx_deserialize */

$size = “large”;
$var_array = array(
“color” => “blue”,
“size”  => “medium”,
“shape” => “sphere”
);
extract($var_array, EXTR_PREFIX_SAME, “wddx”);

echo “$color, $size, $shape, $wddx_size\n”;

The above example will output:

blue, large, sphere, medium

 

語法

extract( array , extract_rules , prefix )
參數 描述
array 必需。規定要使用的數組。
extract_rules 可選。extract() 函數將檢查每個鍵名是否為合法的變量名,同時也檢查和符號表中已存在的變量名是否衝突。對不合法和衝突的鍵名的處理將根據此參數決定。

可能的值:

  • EXTR_OVERWRITE – 默認。如果有衝突,則覆蓋已有的變量。
  • EXTR_SKIP – 如果有衝突,不覆蓋已有的變量。
  • EXTR_PREFIX_SAME -如果有衝突,在變量名前加上前綴prefix
  • EXTR_PREFIX_ALL -給所有變量名加上前綴prefix
  • EXTR_PREFIX_INVALID -僅在不合法或數字變量名前加上前綴prefix
  • EXTR_IF_EXISTS – 僅在當前符號表中已有同名變量時,覆蓋它們的值。其它的都不處理。
  • EXTR_PREFIX_IF_EXISTS – 僅在當前符號表中已有同名變量時,建立附加了前綴的變量名,其它的都不處理。
  • EXTR_REFS – 將變量作為引用提取。導入的變量仍然引用了數組參數的值。
prefix 可選。請注意prefix僅在extract_type的值是EXTR_PREFIX_SAME,EXTR_PREFIX_ALL,EXTR_PREFIX_INVALID或EXTR_PREFIX_IF_EXISTS時需要。如果附加了前綴後的結果不是合法的變量名,將不會導入到符號表中。

前綴和數組鍵名之間會自動加上一個下劃線。

物件與函式的傳址呼叫

文章來源
http://www.php5.idv.tw/bb-1646.htm

作 者: sparkler

==============================================================================
//在 PHP 5 裡面,
//運算元若為物件, =號後面運算式 若有& 代表位置相同, 而不是拷貝結構
//記憶體實際上只有一份
//而且 PHP 5 即使是透過 function 傳遞, 只要變數是物件 不論有無加 &
//都是傳址呼叫

class PObject{
var $i;
}

$lpObject1 = new PObject();
$lpObject1->i = 123;
$lpObject2 = $lpObject1;
echo $lpObject2->i.'<br/>’; //出現 123
$lpObject3 = &$lpObject1;
echo $lpObject3->i.'<br/>’; //出現 123

unset($lpObject1);
echo $lpObject2->i.'<br/>’; //出現 123
echo $lpObject3->i.'<br/>’; //出現 123

$lpObject2->i = 1234;
echo $lpObject3->i.'<br/>’; //出現 1234 不管是不是用 & 生成的變數

// PHP 5 即使是透過 function 傳遞, 只要變數是物件 不論有無加 &
//都是傳址呼叫

function foo1($m){
echo $m->i.'<br/>’; ; //出現 1234
$m->i = 456;
}

foo1($lpObject2);
echo $lpObject2->i.'<br/>’; //出現 456

function foo2(&$n){
echo $n->i.'<br/>’; //出現 456, 因為 $lpObject3 和 $lpObject2 是同一個記憶體
$n->i = 789;
}

foo2($lpObject3);
echo $lpObject3->i.'<br/>’; //出現 789
echo $lpObject2->i.'<br/>’; //出現 789 因為 $lpObject3 和 $lpObject2 是同一個記憶體

//PHP5 若有多個物件變數指向同一份記憶體
//則當所有指向同一份記憶體的變數全部都 unset 才會真正清除該記憶體
unset($lpObject2);
echo $lpObject3->i.'<br/>’; //$lpObject2 和 $lpObject3 相同記憶體, unset $lpObject2 後仍然出現 789

//但是當變數用來存放非物件 比如說整數,
則 function 裡面有 &$i 表示傳址, 不加 & 表示傳值
等號表示拷貝記憶體變成不同的兩塊
就是說單純型別時 =& $i 和 = $i 意義不同
就是說物件型別時 =& $i 和 = $i 意義相同
?>

^_^ 小心用囉, 包括 unset 和 =號 和 &
意義都和 PHP4 不同

==============================================================================
//function(參數…) 參數宣告沒有加 & 表示傳值呼叫
//則宣告的參數將會生成於 function 的開始符號 {
//摧毀於 結束符號 }
//就是說 function 內宣告的參數和呼叫來源傳入的參數 是不同的記憶體
//變數生命週期於 function

function foo($input,$y){
$input = ‘aaa’;
$y = ‘bbb’;
}
$x = 123;
$y = 456;
foo($x,$y);
echo $x; //出現 123
echo $y; //出現 456

//在 function 的宣告式 將參數加上 & 符號, 表示傳址呼叫
//不論傳入前的名稱 是否和宣告的參數名稱是否相同 都會按照順序配對記憶體相同
//如下 $x 和 function 裡面的 $input 的記憶體相同
// $y 和 function 裡面的 $y 的記憶體相同
//既然記憶體相同 那麼 function 裡面的變數一但變更 所有對應的相同的記憶體的變數 echo 結果當然一樣
function foo2(&$input,&$y,$qoo){
echo $input;
echo $y;
echo $qoo;
$input = ‘aaa’;
$y = ‘bbb’;
$qoo = ‘3388’; //function 結束標記 } 時摧毀 $qoo
//…
//…
}
$x = 123;
$y = 456;
$zoo = ‘2266’;
foo2($x,$y,$zoo);
echo $x; //出現 aaa
echo $y; //出現 bbb
echo $zoo; //出現 2266

// PHP 不支援指標運算, 所以 & 在等號之後不能進行運算式
$input1 = 1;
$input1 = &$input1; //可以這樣寫 奇怪的寫法 對 C++ 而言是指標, 但 沒什意義等同 $input1 = $input1; //執行期解譯不會錯誤
//echo *$input; ///錯 不能這樣寫, PHP 不支援 * 用法, echo *$input 這是 C++ 的用法
echo $input1;
$input2 = &$input1; //可以這樣寫 表示兩個變數是同一個記憶體
echo $input2;
//$input = &$input + 1; //可以這樣寫 不會發生執行期解譯錯誤, 但是等同 $input = $input
//$input = (&$input + 1); //錯 不能這樣寫 發生執行期解譯錯誤
//$input = &($input + 1); //錯 不能這樣寫 發生執行期解譯錯誤
//$input2 = (&$input) + 1; //錯 不能這樣寫 發生執行期解譯錯誤

PHP 切中文字串怎麼切

資料來源
http://ronny.wang/blog/post/27553364-php-%E5%88%87%E4%B8%AD%E6%96%87%E5%AD%97%E4%B8%B2%E6%80%8E%E9%BA%BC%E5%88%87

 

PHP 有一系列的 Multibyte String Functions ,很適合拿來處理 CJK 這些 Mutilbyte 字元
其中在切字串的部分就有三個不同的 function 可以用
分別是 mb_strcut, mb_substr, mb_strimwidth

mb_strcut($str, $start, $length, $charset); 所切出來的字串,是 byte 數不超過 $length 的字串,所以像是
mb_strcut(‘我是ronnywang’, 0, 8, ‘UTF-8’); 出來的就是 「我是ro」
適合用在所儲存的地方空間有限時,確保所占空間不要超過某個數字,但是又不要把 multibyte 字腰斬所使用。

mb_substr($str, $start, $length, $charset); 所切出來的字串,是總字數不超過 $length 的字串,其中中文和英文都分別算是一個字元,所以像是
mb_substr(‘我是ronnywang’, 0, 5, ‘UTF-8’); 出來的就是 「我是ron」 (總共四個字)

mb_strimwidth($str, $start, $width, $trimmarker, $charset); 所切出來的字串,是總長度不超過 $width 的字串,另外如果字需要被切到的話,還會幫你補上 $trimmarker (加上 $trimmarker 之後也不會超過 $width) ,而長度的部分,是以半形字是 1 全形字是 2 來計算,因此跟實際顯示出來的寬度會差不了多少。
像是
mb_strimwidth(‘我是ronnywang’, 0, 9, ‘…’, ‘UTF-8’); 出來的就是 「我是ro…」 (寬度為 9)
mb_strimwidth(‘我是’, 0, 9, ‘…’, ‘UTF-8’); 出來的就是 「我是」(寬度為4,小於 $width 就不會印出 … 了)
mb_strimwidth(‘我是ronny’, 0, 9, ‘…’, ‘UTF-8’); 出來的就是 「我是ronny」(寬度為9,剛好等於 $width 也不會印 …)
適合用在要顯示一些固定長度的文字使用。

另外還有幾個取得長度的方式

strlen($str); 最原始的,取得就是 byte 數,像是
strlen(‘我是誰’); 在 UTF-8 就是 9 ,一個字 3 bytes 。

mb_strlen($str, $charset); 出來的是字數,像是
mb_strlen(‘我是誰’, ‘UTF-8’) 是 3
mb_strlen(‘我是ronny’, ‘UTF-8’) 是 7

mb_strwidth($str, $charset); 出來的是寬度,一樣是半形字算 1 ,全形字算 2
mb_strwidth(‘我是誰’, ‘UTF-8’) 是 6
mb_strwidth(‘我是ronny’, ‘UTF-8’) 是 9

依照不同需求就使用不同函式囉。

PHP5.2 仿 array_walk_recursive 過濾空白的作法

/**
* @beief 過濾陣列裡所有值裡的前後空白字元(遞迴) / 目前在PHP5.2裡, 沒有array_walk_recursive可以用, 根據傳入的資料結構手動轉.
* @param array arr: 陣列.
* @return array.
*/
function getFilterArrayBlank($arr)
{
$ret = array();

foreach($arr as $k => $v)
{
if(is_array($v)) {
$value = getFilterArrayBlank($v);
}
else {
$v = preg_replace(‘/[\n\r\t\s]/’, ”, $v); // 去除多餘空白;
$v = preg_replace(‘/[ ]/’, ”, $v); // 去除全形空白;
$value = mysql_real_escape_string($v);
}
$ret[$k] = $value;
}

return $ret;
}