首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >代码缩写、排序依据和切换

代码缩写、排序依据和切换
EN

Stack Overflow用户
提问于 2013-12-17 01:11:39
回答 5查看 70关注 0票数 0

你能帮我缩短代码吗?重点是,我希望根据给定的$T以不同的顺序从数据库中提取数据。有什么想法吗?

代码语言:javascript
复制
public function rewriteQuery($T){

switch ($T) {

    case 0:
        $query="SELECT id, title FROM kshome WHERE del=0 AND active=1 ORDER BY FIELD(id,1,2,3,4,5,6)";  
        break;
     case 1:
        $query="SELECT id, title FROM kshome WHERE del=0 AND active=1 ORDER BY FIELD(id,2,3,4,5,6,1)";  
        break;
     case 2:
        $query="SELECT id, title FROM kshome WHERE del=0 AND active=1 ORDER BY FIELD(id,3,4,5,6,1,2)";    
        break;
     case 3:
       $query="SELECT id, title FROM kshome WHERE del=0 AND active=1 ORDER BY FIELD(id,4,5,6,1,2,3)";  
        break;
     case 4:
      $query="SELECT id, title FROM kshome WHERE del=0 AND active=1 ORDER BY FIELD(id,5,6,1,2,3,4)";  
        break;
    default:
       $query="SELECT id, title FROM kshome WHERE del=0 AND active=1 ORDER BY FIELD(id,6,1,2,3,4,5)";  
    break;

    }        

  return $query;             

} 
EN

回答 5

Stack Overflow用户

发布于 2013-12-17 01:20:21

缩短这段时间的一种方法是创建一个返回order by字段的数组。

如下所示:

代码语言:javascript
复制
$order_by_array = array(
  0 => "(id,1,2,3,4,5,6)", 
  1 => "(id,2,3,4,5,6,1)", 
  2 => "(id,3,4,5,6,1,2)", 
  3 => "(id,4,5,6,1,2,3)", 
  4 => "(id,5,6,1,2,3,4)"
);

然后,您的rewriteQuery($T)函数可以重写为:

代码语言:javascript
复制
public function rewriteQuery($T){
  $order_by = "(id,6,1,2,3,4,5)"; // Default
  if (array_key_exists($T, $order_by_array)) {
    $order_by = $order_by_array[$T];
  }

  $query = "SELECT id, title FROM kshome WHERE del=0 AND active=1 ORDER BY FIELD{$order_by}";
  ...
}
票数 1
EN

Stack Overflow用户

发布于 2013-12-17 01:15:31

除了消除构造查询字符串中的冗余之外,我看不到更多可以缩短的内容:

代码语言:javascript
复制
public function rewriteQuery($T){

$query = "SELECT id, title FROM kshome WHERE del=0 AND active=1 ORDER BY FIELD";
switch ($T) {
    case 0:
        $query.="(id,1,2,3,4,5,6)";  
        break;
     case 1:
        $query.="(id,2,3,4,5,6,1)";  
        break;
     case 2:
        $query.="(id,3,4,5,6,1,2)";    
        break;
     case 3:
       $query.="(id,4,5,6,1,2,3)";  
        break;
     case 4:
      $query.="(id,5,6,1,2,3,4)";  
        break;
    default:
       $query.="(id,6,1,2,3,4,5)";  
    break;

    }        

  return $query;             
票数 0
EN

Stack Overflow用户

发布于 2013-12-17 01:49:21

虽然我更喜欢其他答案,以防您的排序是固定的,但这里有一个更灵活的解决方案:

代码语言:javascript
复制
function rewriteQuery($T) {
    $query = "SELECT id, title FROM kshome WHERE del=0 AND active=1 ORDER BY FIELD(id,";
    $order = array("1", "2", "3", "4", "5", "6");

    if($T < count($order)) {
        for($i = $T, $end = false;;$i++) {
            if($i == count($order)) {
                $i = 0;
                $end = true;
            }

            if($end && $i == $T) {
                break;
            }

            $query .= $order[$i] . ",";
        }

        $query = substr($query, 0, -1) . ")";

        return $query;
    } else {
        return "ERROR";
    }
}

$index = 5;

echo rewriteQuery($index);

请参阅PHPfiddle

基本上,你必须意识到你的$T只不过是你想要开始你的订单的索引(给定你的订单是一个数组)。一旦你意识到这一点,你就可以实现以下逻辑:

$T为起点,我们遍历数组,直到到达终点,然后将$i设置为零,并激活一个结束条件以不运行无限循环。$i将继续增加,直到达到$T,然后退出循环。剩下的就是去掉后面的,了。我只需将其替换为)以完成查询。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20616601

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档