【问题标题】:php sort after query fired查询触发后的php排序
【发布时间】:2013-08-14 13:23:32
【问题描述】:

我想从最高到最低的 cip 以及从最低到最高的 cip 排序,但是 cip 值没有存储在数据库中,它是在查询被触发时立即计算的。 这是选择排序的html代码:

  <select name="cip">
                    <option>Select CIP percentage</option>
                    <option value="1">Highest To Lowest</option>
                    <option value="2">Lowest To Highest</option>
            </select>

这是我触发的查询!

    $select_applicant = "SELECT j.*, u.id, u.gender
                        FROM job_apply j
                        LEFT JOIN users u
                        ON u.id = j.user_id
                        WHERE j.job_id = '".$jid."'";

    $result_applicant = mysqli_query($con, $select_applicant);
    while($row_applicant = mysqli_fetch_assoc($result_applicant))
    {
        $user_id = $row_applicant["user_id"];
        $user_info = get_user_profile_info($user_id);
        $ratings_dist = get_skill_ratings_stats($user_id);
                $got_it_total_rating = 0;
                foreach($ratings_dist as $category=>$rating)
                {
                    $got_it_total_rating = $got_it_total_rating + $rating['score'];
                }
                $got_it_total_category = count($ratings_dist);
                $total_cip = ceil($got_it_total_rating / $got_it_total_category);

                echo $total_cip;
    }

php中的“get_skill_ratings_stats”函数如下:

function get_skill_ratings_stats($user_id){
    global $con;
    $items = array();
    if($user_id>0)
    {
        $sql = "SELECT 
            s.category_id category_id, 
            c.name as category, 
            COALESCE(r.score_quality, 0.0) quality, 
            COALESCE(r.score_timing, 0.0) timing, 
            COALESCE(r.score_budget, 0.0) budget, 
            COALESCE(r.score_resp, 0.0) resp, 
            COALESCE(r.score_pro, 0.0) pro
        FROM `user_skills` s 
        LEFT JOIN `skill_categories` c
        ON c.category_id=s.category_id
        LEFT JOIN `skill_ratings` r
        ON r.skill_id=s.skill_id 
        WHERE s.user_id = '".(int)$user_id."'
        AND s.status = 'active'
        ORDER BY category ASC";
        $prev_cat   = '';
        $result     = mysqli_query($con, $sql);
        // die(mysqli_error($con));
        while($row = mysqli_fetch_assoc($result))
        {   
            // print_r($row);
            if(!$row['category']) continue;
            if($row['category']!=$prev_cat)
            {
                if(isset($items[$prev_cat]['score']) && $items[$prev_cat]['score']>0 && count($items[$prev_cat])>1)
                {
                    $items[$prev_cat]['score'] = floor(($items[$prev_cat]['score']*20)/(count($items[$prev_cat])-1));
                }
                $prev_cat = $row['category'];
            }
            if(!isset($items[$prev_cat]['score'])) $items[$prev_cat]['score'] = 0;
            $items[$prev_cat][]             = $row;
            $items[$prev_cat]['score']  += ($row['quality']+$row['timing']+$row['budget']+$row['resp']+$row['pro'])/5;
        }
    }
    // print_r($items);
    // die();
    if(isset($items[$prev_cat]['score']) && $items[$prev_cat]['score']>0 && count($items[$prev_cat])>1)
    {
        $items[$prev_cat]['score'] = floor(($items[$prev_cat]['score']*20)/(count($items[$prev_cat])-1));
    }
    $tmp = array();
    foreach($items as $cat=>$item) {
        $tmp[$item['score'].'-'.$cat] = $item;
    }
    krsort($tmp);
    $items = array();
    foreach($tmp as $k=>$v) {
        $k = preg_replace('#^\d+-#is', '', $k);
        $items[$k] = $v;
    }
    // print_r($tmp);
    // print_r($items);
    // die();
    return $items;
}

请帮帮我!很难过!

【问题讨论】:

  • 你试过usort()吗?
  • 我在 php.net 上读到过它,但不知道如何在我的情况下应用它!你能帮我吗?
  • 您是否尝试在 Google 上搜索“如何使用 usort”?
  • 是的,我做到了,我尝试了如下链接:w3schools.com/php/showphp.asp?filename=demo_func_usort 但是不成功!
  • 您到底尝试了什么,为什么不在这里发布?

标签: php arrays sorting mysqli


【解决方案1】:

假设您使用 html 表格来显示它,我会选择 http://datatables.net/ ,它会很容易地为您提供很多排序选项...

否则usort():

function cip($a, $b)
{
    if ($a['cip'] == $b['cip']) {
        return 0;
    }
    return ($a['cip'] < $b['cip']) ? -1 : 1;
}

$data = array(
   [0] => array('cip' => 1)
   [1] => array('cip' => 5)
   [2] => array('cip' => 2)
);

usort($data, "cip");

foreach ($a as $key => $value) {
    echo "$key: $value\n";
}

假设你的数组看起来像这样:

array(
   [0] => array('cip' => 1)
   [1] => array('cip' => 5)
   [2] => array('cip' => 2)
)

它基本上循环直到所有东西都排序,你在回调函数中所做的就是告诉它要比较哪些值......

编辑:

$total_cips[] = array('user_id' => $user_id, 'cip' => ceil($got_it_total_rating / $got_it_total_category));

好的,那么现在你有一个数组中的所有 cips 和 user_id 对吗?

在 for 循环之外,您调用 usort($total_cips, "cip");

那么你有一个排序数组,如果你想改变排序方向,只需在 cip 函数中将greater than 更改为less than

【讨论】:

  • 如何将查询中的所有 total_cip 值放入数组中?
  • 好吧,我认为你的工作在 get_skill_ratings_stats 函数中完成了吗?我想你正在获取数据,然后你想对其进行排序?我可能完全遗漏了一些东西,但是这些数据会以数组的形式返回,您会 usort() 那个数组吗?
  • 经过一些计算,我得到了 total_cip 而你可以看到!所以我想对 total_cip 值进行排序......但问题是我如何从 while 循环中收集所有 total_cip 值,然后用 usort 对其进行排序......
【解决方案2】:

正如We0所说,

 $total_cips[] = array('user_id' => $user_id, 'cip' => ceil($got_it_total_rating / $got_it_total_category));

但后来我使用了多重排序功能:

            function multi_sort($array, $akey)
            { 
              function compare($a, $b)
              {
                 global $key;
                 return strcmp($a[$key], $b[$key]);
              }
              usort($array, "compare");
              return $array;
            }

然后我调用如下函数:

$total_cips = multi_sort($total_cips, $key = 'cip');

这个终于成功了!

无论如何感谢We0 & Ankit

【讨论】:

    【解决方案3】:

    这里:

     $select_applicant = "SELECT j.*, u.id, u.gender
                            FROM job_apply j
                            LEFT JOIN users u
                            ON u.id = j.user_id
                            WHERE j.job_id = '".$jid."";
    

    $jid 缺少 closing quote。应该是:

     $select_applicant = "SELECT j.*, u.id, u.gender
                            FROM job_apply j
                            LEFT JOIN users u
                            ON u.id = j.user_id
                            WHERE j.job_id = '".$jid."'";
    

    这可能是您的问题的原因之一。

    【讨论】:

    • 我已经得到了结果......这不是问题......我只是希望它能够排序......感谢您的关注!
    • 我想知道你是如何得到你的结果的:o。缺少引号必须是语法错误。我刚刚检查了 phpmyadmin :D。我认为没有理由对我的答案投反对票(对于投反对票的人)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-23
    • 1970-01-01
    • 2018-11-17
    • 2020-05-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多