2017年1月7日 星期六

如何比對 PHP 陣列的元素

最近在寫 PHP 專案時要用到陣列元素比對的功能, 因為從來沒用過, 就上網搜尋 "PHP 陣列 比對", 結果發現 PHP 有兩個內建的函數 array_intersect() 與 array_diff() 剛好符合我的要求, 參考 :

# php計算兩個陣列的交集和差集

這實在是太棒了! PHP 會這麼受歡迎不是沒道理的.

首先就來測試看看 array_intersect() 函數, 此函數可以傳遞多個參數進去, 每一個都是陣列, 它會將第一個陣列的元素同時也出現在其他陣列者以陣列形式傳回, 換句話說就是傳回第一陣列與其他陣列的交集, 並保留交集元素在第一個陣列內的索引 (index) 或鍵 (key). 參考 :

# PHP Manual : array_intersect

例如下面的範例 :

  $a=["小新","廣治","小葵"];
  $b=["小葵","風間","小新"];
  $c=array_intersect($a, $b);
  print_r($c);

這裡有兩個陣列 $a, $b, 其元素為蠟筆小新中人物的名字, 傳入 array_intersect() 當參數會傳回 $a, $b 元素的交集陣列 $c. 將上面程式碼貼到 TutorialsPoint 網站執行 :

# https://www.tutorialspoint.com/execute_php_online.php

按行號上面的 "Execute" 會在下方命令列看到 $c 陣列的內容 :

Array                                                                                                                                                                
(                                                                                                                                                                    
    [0] => 小新                                                                                                                                                        
    [2] => 小葵                                                                                                                                                        
)     

注意, 交集陣列還保留了這兩個交集元素在第一個陣列 $a 中的鍵值 0 與 2.

對於字串鍵值也是一樣, 如下面範例所示 :

  $a=Array("木瓜", "apple" => "蘋果", "grape" => "葡萄");
  $b=Array("banana" => "香蕉", "木瓜", "apple" => "蘋果");
  $c=array_intersect($a, $b);
  print_r($c);

執行結果如下 :

Array                                                                                                                                                               
(                                                                                                                                                                   
    [0] => 木瓜                                                                                                                                                       
    [apple] => 蘋果                                                                                                                                                   
)  

陣列 $a 元素同時也出現在陣列 $b 的就只有 "木瓜", "蘋果" 這兩個元素, 而且他們在陣列 $a 中的索引與鍵值都有保留.

接下來看 array_diff(), 此函數同樣要傳入多個陣列, 它會傳回第一個陣列中, 沒有出現在其他陣列之元素, 意即傳回第一陣列與其他陣列的差集, 傳回值也是陣列. 參考 :

PHP Manual : array_diff

例如下面範例 :

  $a=["小新","廣治","小葵"];
  $b=["小葵","風間","小新"];
  $c=array_diff($a, $b);
  print_r($c);

執行結果如下 :

Array                                                                                                                                                               
(                                                                                                                                                                   
    [1] => 廣治                                                                                                                                                       
)     

第一個陣列 $a 的元素中只有 "廣治" 沒有出現在後續的陣列中. 同樣它保留了 "廣治" 在第一個陣列中的索引.

另一個範例是 :

  $a=Array("木瓜", "apple" => "蘋果", "grape" => "葡萄");
  $b=Array("banana" => "香蕉", "木瓜", "apple" => "蘋果");
  $c=array_diff($a, $b);
  print_r($c);

執行結果是 :

Array                                                                                                                                                               
(                                                                                                                                                                   
    [grape] => 葡萄                                                                                                                                                   
)   

即第一個陣列 $a 中只有 "葡萄" 沒有出現在後續的陣列中.

最後紀錄一下這兩個函數在金融運算上的應用, 例如要從證交所公布的法人買賣超資料找出近十日外資買超個股第一次進入排行的股票時就可利用 array_diff() 一次到位找出來. 可將近十日買超排行放在 $fini[0]~ $fini[9] 這十個陣列中 (意即 $fini 是個二維陣列), 其中 $fini[0] 為近一日排行, 而 $fini[9] 則為十天前的排行, 只要將 $fini[0] 作為第一陣列, 就能將近一日排行中出現, 但在前九日排行中未出現的標的抓出來 :

$fini_10days_first=array_diff(
  $fini[0], $fini[1], $fini[2], $fini[3], $fini[4], $fini[5], $fini[6], $fini[7], $fini[8], $fini[9]);

而要找出連續兩日買超或當日同步買超的話就要使用 array_intersect() 函數了.

沒有留言 :