将PHP foreach循环从最低到最高排序

时间:2018-01-13 17:23:22

标签: php

我有一个PHP foreach循环,在每个用户配置文件中显示最低的速率。如何在不更改SQL语句的情况下对foreach循环进行排序以显示从最低到最高速率的配置文件?

$results = DB::query('SELECT users.`id`, rates.`basic`, rates.`standard`, rates.`premium` FROM rates, users WHERE rates.`rate_id` = users.`id`');

foreach($results as $row){
  if($row['basic'] !=""){
     $minrate = $row['basic'];
  }elseif($row['standard'] !=""){
     $minrate = $row['standard'];
  }elseif($row['premium'] !=""){
      $minrate = $row['premium']; 
  }
  <?php echo $minrate ?>
}

2 个答案:

答案 0 :(得分:2)

理想的解决方案是在排序结果时使用SQL。但如果由于某种原因,您无法改变SQL代码。你可以:

    $tempArr = array();
    foreach($results as $row){
        if($row['basic'] != ""){
             $minrate = $row['basic'];
        }elseif($row['standard'] !=""){
             $minrate = $row['standard'];
        }elseif($row['premium'] !=""){
              $minrate = $row['premium']; 
        }

        //Make the $minrate the key - Will be easy to sort | Make a multi dimensional array, incase duplicate on $minrate
        if ( !isset( $tempArr[ $minrate ] ) ) $tempArr[ $minrate ] = array();
        $tempArr[ $minrate ][] = $row;
    }

    //Sort an array by key
    ksort( $tempArr );

    //Make Multi dementional array to single array
    $sortedResult = array();
    foreach( $tempArr as $tempArr2 ) {
        foreach( $tempArr2 as $value ) {
            $sortedResult[] = $value;
        }
    }

    //$sortedResult <-- As the variable says, It should be sorted
    echo "<pre>";
    print_r( $sortedResult ) ;
    echo "</pre>";

答案 1 :(得分:0)

似乎你有不好的数据结构而不是用户和用户费率之间的关系你有一组关系不同的可能的比率

然后你可以使用case来过滤(并规范化)列的集合 并且您可以直接从SQL

获取有序结果
   SELECT 
    users.id, 
      case when  rates.basic is not null then 0
           when  rates.standard is not null then 1
           when  rates.premium is not null then 2 
          end as my_rate,
      case when  rates.basic is not null then 'BASIC'
           when  rates.standard is not null then  'STANDARD'
           when  rates.premium is not null then  'PREMIUM'
          end as my_rate_text    
      FROM rates, users WHERE rates.`rate_id` = users.`id`
      ORDER BY  my_rate
      ;