2016年4月24日星期日

PHP 模擬 SQL GROUP BY 語法

續上次 模擬 ORDER BY 的語法
今次在下又無聊地編寫一個模擬 GROUP BY 的語法

function array_groupby($array, $groups){
    if (count($groups) > 0){
        $fields = array();
        foreach ($array as $key => $value){
            $field = array();
            $grouped = true;
            foreach ($groups as $group){
                if (isset($value[$group])){
                    $field[$group] = $value[$group];
                } else {
                    $grouped = false;
                    break;
                }
            }
            if ($grouped){
                if (in_array($field, $fields, true)){
                    unset($array[$key]);
                } else {
                    array_push($fields, $field);
                }
            } else {
                unset($array[$key]);
            }
        }
    }
    return array_values($array);
}
使用
$array = array(
    array(
        'id' => 1,
        'age' => 18,
        'height' => 180,
    ),
    array(
        'id' => 2,
        'age' => 22,
        'height' => 160,
    ),
    array(
        'id' => 3,
        'age' => 18,
        'height' => 160,
    ),
    array(
        'id' => 4,
        'age' => 22,
        'height' => 180,
    ),
);

$groups = array(
    'age',
);

$array = array_groupby($array, $groups);

print_r($array);
設計上大致與 SQL 既 GROUP BY 相似
會將群組化的第一個紀錄成為輸出資料
最後用 array_values($array) 將 index 由 0 重新開始排列

沒有留言 :

發佈留言