星期五, 10月 08, 2010

Zend PHP 5 Certification Study Guide 筆記 (一)

  1. basic

    • ==及===的不同
      var_dump (1 == 1);//true
      var_dump (1 == "1");//true
      var_dump (1 === 1); //true
      var_dump (1 === "1"); //false, 值要相同,同型態 (比陣列,還要Order相同)

  2. function

    • Returning Values
      function可以call by reference
      但回傳值就必需有變數
      //example 1
      function &query($sql)
      {
        $result  = mysql_query($sql);
        return $result; //return variable
      }
      
      //example 2, incorrect and will cause PHP to emit a notice when called
      function &getHollo()
      {
        return "Hello World"; //非variable
      }
      
      //example 3 also cause the warning to be issued when called
       function &test()
      {
        echo 'This is a test';
      }
    • Passing Arguments
      function hello($who = "World")
      {
       echo "Hello $who"; 
      }
      hello(); //pass in no argument and $who is assigned "World" by default
  3. Arrays

    • Array Basic
      $x[] = 10;
      $x['aa'] = 11;
      echo $x[0]; //Outputs 10
      
      //continue, what if 
      $x[0]=12; // 
      echo $x[0]; //Outputs 12, 蓋掉了 

      另外新增元素會從Array中最大的數值增加
      $a = array(2 => 5);
      $a[] = 'a'; //This will have a key of 3
      
      $b = array( '4' => 5,'a' => 'b');
      $a[] = 44; //This will have a key of 5<$/code>
      
      key中,'A'跟'a'不同,但'1'跟1相同
    • Array Operations
      $a = array(1,2,3);
      $b=array("a" => 4,5,6);
      var_dump($a + $b);
      
      //result in
      array(4){
      [0] => int(1)
      [1] => int(2) 
      [2] => int(3)
      [a] => int(4) //沒有5,6
      }
      為什麼5,6不見了?
      因為$b = ('a'=> 4,1 => 5, 2 => 6);
      而$a + $b時,被前面的$a搶走了...

      var_dump及print_r的差別
      =>一樣,但前者會印
      型態
      Comparing Arrays
      $arrayA == $arrayB   //當陣列數一樣,值一樣
      $arrayA === $arrayB //當陣列數一樣,值一樣,Order也一樣
    •  Array Iteration
      Array pointer問題
      $a = array('zero','one','two');
      foreach($a as &$v){
      }
      foreach($a as $v){
      }
      print_r($a);
      
      //outputs
      Array
      {
        [0] = zero
        [1] = one
        [2] = one //two被改one了
      }
      2個foreach都沒做事,為何會變改
      因為第一個foreach的$v是call by reference
      在迴圈結束時,$v停在$a[2](two)

      在第二個foreach時
      第1次被指向array index 0, 被assign "zero"...
      第2次被指向array index 1, 被assign "one"...
      第3次被指向array index 2, 被assign "one"(原本的值"two",在上一輪改為"one"了)
      所以囉 這不是php的bug
    • Sorting Arrays
      >>>>>
      Name說明Key
      sort($array);排序value,可加第二參數
      SORT_REGULAR, SORT_NUMERIC, SORT_STRING
      destory
      asort($array);排序value,key被保留保留
      rsort($array);sort()是ascending order,rsort()即為decending orderdestory
      arsort($array);即為decending order
      natsort($array);sort(),排序10t,2t,3t(因此10t的1先出現),此時利用natsort即可解決destory
      natcasesort($array);考慮大小寫不同destory
      ksort($array);依key排序 low to high (krsort相反)保留
      usort($array,'myCmp');user defineddestory
      uasort($array,'myCmp');保留key保留
      uksort($array,'myCmp');依key排序保留

       
    • The Anti-Sort
      Name說明
      shuffle($card);將array往後移一位(最後一個變第一個)
      array_rand($card,[, int num_req]);隨機挑n個key

       
    • Set Functionality
      Name說明
      array_diff($a,$b)$a的差集($a有什麼$b沒有的)
      array_intersect($a,$b)$a,$b的交集






6 則留言:

Unknown 提到...

Array Iteration 的 Array pointer問題沒看懂@@
可以再解釋一下呢@@
感謝

fishjerky 提到...

嗯嗯 有筆誤
$a = array('zero','one','two')
第一個迴圈是
foreach($a as &$v){
}
第二個迴圈是 (原本$v寫成&$v)
foreach($a as $v){
}
不過結果應該是一樣的吧
因為第一個迴圈利用& (call by reference)
也就是$v值被改變時,array裡的該item就會被更動
因此當第一個迴圈結束時
$v是指向$a[2](two)
是的,一樣沒有改變,依然是two

但當第二個迴圈開始時
loop 1: $v($a[2]) = $a[0] = 'zero'
loop 2: $v($a[2]) = $a[1] = 'one'
loop 3: $v($a[2]) = $a[2] = 'one'

$a[2]先在loop 1,被改成zero後
又在loop 2,被改成one
最後loop 3,因為$a[2]已被改為one,所以一樣是one

要解決這題,建議要先做unset

Unknown 提到...
作者已經移除這則留言。
Unknown 提到...

上面那段請無視ORZ
我到底在問甚麼了囧

問下一個@@
====引用===
但當第二個迴圈開始時
loop 1: $v($a[2]) = $a[0] = 'zero'
loop 2: $v($a[2]) = $a[1] = 'one'
loop 3: $v($a[2]) = $a[2] = 'one'
====引用===
為甚麼一直都是$a[2]的呢=0=

fishjerky 提到...

因為第一個迴圈最後&$v
"停留在"指向$a[2],這個沒問題吧
所以不管這時給$v什麼值
其實就是改變$a[2]的值

所以第二個迴圈
loop 1:將$a[0]的值塞給$v, $a[2]變成zero
loop 2:將$a[1]的值塞給$v, $a[2]變成one
loop 3:將$a[2]的值塞給$v, $a[2]變成one

清楚吧 = =+

Unknown 提到...

唔...大概明吧@@
但總是差了點甚麼的樣子~_~
我再想想吧
謝謝~