0

最初にオンライン ユーザー ラベルを表示し、その後すべてのオンライン ユーザーを表示し、その後最初のラベルを終了する必要があります。<optgroup>

Offline と Idle も同様です。

コード:

foreach($alt_user_result as $cur_user) {
    if( $cur_user[user_status]=='online') {
        echo "<option class='green_status' value='$cur_user[user_id]'>$cur_user[username] | $cur_user[user_status]
        </option>";
    }
    elseif( $cur_user[user_status]=='idle') {
        echo "<option class='yellow_status' value='$cur_user[user_id]'>$cur_user[username] | $cur_user[user_status]
        </option>";
    }
    elseif( $cur_user[user_status]=='offline') {
        echo "<option class='gray_status' value='$cur_user[user_id]'>$cur_user[username] | $cur_user[user_status]
        </option>";
    }
}

たとえば、<optgroup>前に追加しようとしましたが、次のようになります<option class='gray_status'

<optgroup><option></option><optgroup>
<optgroup><option></option><optgroup>
<optgroup><option></option><optgroup>
<optgroup><option></option><optgroup>
<optgroup><option></option><optgroup>

そして私はこのようにしたい:

    <optgroup lable="online">
    <option></option>
    <option></option>
    <option></option>
    <optgroup>


    <optgroup lable="offline">
    <option></option>
    <option></option>
    <option></option>
    <optgroup>

......

クエリ:

$alt_user_result = execute_pdo_query("SELECT U.username, U.user_id, T.last_activity_time,
case WHEN TIMESTAMPDIFF( MINUTE, T.last_activity_time ,NOW() ) <= 5 THEN 'online'
 WHEN ( TIMESTAMPDIFF( MINUTE, T.last_activity_time ,NOW() ) > 5 AND
  TIMESTAMPDIFF( MINUTE, T.last_activity_time ,NOW() ) <=30 ) THEN 'idle'
    ELSE 'offline' end as user_status
     FROM user_skills S, users U
      LEFT JOIN user_status T ON U.user_id=T.user_id
         WHERE S.user_id=U.user_id and S.task_type_id=? and S.permission='Yes';",
           array($tablerow['task_type_id']));

事前に助けてくれてありがとう!

4

2 に答える 2

2

配列がオンライン状態でソートされている場合、次のような簡単なことを行うことができます:

$prevGroup = '';

foreach($alt_user_result as $cur_user) {
    $curGroup = $cur_user['user_status'];

    if ($curGroup != $prevGroup) {
        if ($prevGroup != '') {
            echo '</optgroup>';
        }

        echo '<optgroup label="' . ucfirst($curGroup) . '">';
        $prevGroup = $curGroup;
    }

    if ($cur_user[user_status] == 'online') {
        echo "<option class='green_status' value='$cur_user[user_id]'>$cur_user[username] | $cur_user[user_status]
    </option>";
    } else if ($cur_user[user_status] == 'idle') {
        echo "<option class='yellow_status' value='$cur_user[user_id]'>$cur_user[username] | $cur_user[user_status]
    </option>";
    } else if ($cur_user[user_status] == 'offline') {
        echo "<option class='gray_status' value='$cur_user[user_id]'>$cur_user[username] | $cur_user[user_status]
    </option>";
    }
} // foreach

echo '</optgroup>';

アレイがオンライン ステータスでソートされていない場合はusort()、上記のコードを実行する前に を使用してソートできます。

編集:これは、usortを希望する順序で配列をソートするコードです:

function userStatusSort($a, $b) {
    $a = $a['user_status'];
    $b = $b['user_status'];

    if ($a == $b) {
        return 0;
    } else if ($a == 'online') {
        return -1;
    } else if ($a == 'idle' && $b == 'offline') {
        return -1;
    } else {
        return 1;
    }
}
于 2012-08-10T01:27:09.517 に答える
0

ユーザーを別々の配列にソートすることから始めます

$online_users = array();
$offline_users = array();
$idle_users = array();

foreach($alt_user_result as $cur_user) {
    if($cur_user[user_status]=='online'){
        $online_users[] = $cur_user;
    }
 //and so forth...

}

そしてそれらをエコーアウトします

 echo "<optgroup>"
 foreach($online_users as $cur_user){
    echo "<option class='green_status' value='$cur_user[user_id]'>$cur_user[username] | $cur_user[user_status]
</option>";
echo "</optgroup>"

}
于 2012-08-10T01:30:32.900 に答える