PDA

View Full Version : سوال: یه تابع برای مشخص کردن نفرات اول تا سوم.



idocsidocs
سه شنبه 13 دی 1390, 00:30 صبح
من یه آزمون 4 گزینه ای آنلاین طراحی کردم.

کاربرها می یان و توی آزمون شرکت می کنن و نمره می گیرن. تا اینجا مشکلی ندارم.

اما وقتی بخوام نفرات اول تا سوم رو مشخص کنم، نمی دونم باید چیکار کنم. لطفا در این مورد راهنمایی کنید.

هادی2020
سه شنبه 13 دی 1390, 02:30 صبح
سلام شاید راه حل بهتری هم باشه.


<?php
$a= array("sahar" =>15 ,"reza" =>20 ,"mohammad" =>17 ,"hamid" =>19 ,"mahdi" =>18 ,"hadi" =>20 ,"hamed" =>16
,"zahra" =>20 ,"ehsan" =>19,"jamshid" =>18 ,"mani" =>10 ,"sajad" =>0 ,"maryam" =>17 );
arsort($a);
foreach ($a as $key => $val) {
echo "$key = $val <br />";
}

reset($a);
//$b=array();
$c=1;
$d=current($a);

foreach ($a as $key => $val)
{
//echo "$key = $val <br />";
if($c==3 && ($d!=$val))
break;
elseif($val==$d)
$b[$c][$key]=$val;
else
{
$d=$val;
$C++‎;
$b[$c][$key]=$val;
}
}
echo("<br />------------------<br />");
echo("<pre>");
print_r($b);
echo("نفرات اول"."<br />");
print_r($b[1]);
echo("نفرات دوم"."<br />");
print_r($b[2]);
echo("نفرات سوم"."<br />");
print_r($b[3]);
echo("</pre>");
?>

برای اینکه اولین شرط رو درک کنید باید حداقل 2تا 18 در آرایه باشد و شرط را به این صورت تغییر دهید همانطور که خواهید دید فقط یکی از هجده ها نمایش داده میشود.
if($c==3)

idocsidocs
سه شنبه 13 دی 1390, 02:47 صبح
امکانش هست که در این مورد بیشتر توضیح بدید؟

من اطلاعات رو توی دیتابیس ذخیره می کنم.

mohsen24000
سه شنبه 13 دی 1390, 08:56 صبح
در کوئری باید از top 3 یا limit 0,3 به همراه order در حالت desc استفاده کنید تا 3نفر اول بر اساس نمره یا معدل برایتان انتخاب شود.

هادی2020
سه شنبه 13 دی 1390, 10:49 صبح
در کوئری باید از top 3 یا limit 0,3 به همراه order در حالت desc استفاده کنید تا 3نفر اول بر اساس نمره یا معدل برایتان انتخاب شود.
دوست عزیز اگه چندتا نفر اول و چندتا نفر دوم و همچنین سوم داشته باشیم چه می شه:متعجب:

امکانش هست که در این مورد بیشتر توضیح بدید؟ اگه منظورتون کدها هستش. ابتدا آرایه رو بصورت نزولی مرتب میکنیم(arsort($a);) بعد از چاپ اشارگر آرایه رو برای دستور current به ابتدای آرایه می فرستیم (reset($a)). و اولین نمره را با دستور current در متغیر d قرار میدهیم که همان نمره هادی میباشد. باز در foreach اولین نفر هادی هستش چون افرادی که نمره یکسانی دارند باید در یک گروه قرار گیرند آنها در elseif سازماندهی شده اند. زمانی نفر دوم مشخص میشود که نمره او با نمره نفر اول فرق داشته باشد(else) پس ابتدا نمره نفر دوم را در متغیر d قرار دهیم تا اگر نمره نفر بعدی با نفر فعلی برابر بود او هم به عنوان نفر دوم معرفی شود(elseif). به متغیر c یک واحد اضافه میکنیم زیرا متوجه شده ایم نفرات اول تمام شده اند پس الان قرار است نفرات دوم را ذخیره کنیم. اولین شرط موقعی برقرار میشود که c سه شده باشد همچنین مقدار value که نمره یکی از نفرات چهارم است با d که در حال حاضر نمره یکی از نفرات سوم است فرق داشته باشد(!= نامساوی) که حتما همینطور هست.
برای بانک دیگه غمیت چیه ابتدا یه select با sort نزولی انجام بده سرت رو هم اگه انجام ندادی با arsort($a) بعدا میتونی. بعدشم که آرایه در اختیارته.


<?php
function search($a=NULL)
{
if($a==NULL) return ;
$c=1;
arsort($a);
reset($a);
$d=current($a);
foreach ($a as $key => $val)
{
if($c==3 && ($d!=$val))
break;
elseif($val==$d)
$b[$c][$key]=$val;
else
{
$d=$val;
$c++;
$b[$c][$key]=$val;
}
}
echo("<pre>");
echo("نفرات اول"."<br />");
print_r($b[1]);
echo("نفرات دوم"."<br />");
print_r($b[2]);
echo("نفرات سوم"."<br />");
print_r($b[3]);
echo("</pre>");
}
//---------------------------------------------------------
function db_result_to_array($result)
{
$res_array = array();
for ($count = 0; $row = mysql_fetch_array($result); $count++)
$res_array[$row['name']] = $row['point'];
return $res_array;
}
//---------------------------------------------------------
$connection = mysql_connect("localhost", "root", "") or
die("Database Connection Failed!");
$db_select = mysql_select_db("library", $connection) or
die("Database Selection Failed!");
$result = @mysql_query("select * from nomarat");
//fields are id, name, point , ...
search(db_result_to_array($result));
?>

البته اگه اطلاعات را در چند جدول ذخیره میکنی میبایست به جای name در دستورات بالا از id استفاده کنی

mohsen24000
سه شنبه 13 دی 1390, 11:02 صبح
select * from table1 where nomre in(
SELECT top 3 nomre
FROM Table1 group by nomre
order by nomre desc )

یا


select * from table1 where nomre in(
SELECT nomre
FROM Table1 group by nomre
order by nomre desc limit 0,3 )

و یا روشهای بهینه دیگه...

M.Rahi
سه شنبه 13 دی 1390, 11:24 صبح
سلام
کدی که آقای mohsen24000 گذاشتند بهتره، البته باید با دستور DISTINCT از مقدار تکراری جلوگیری کنی. کد زیر کارت رو راه میندازه:

SELECT * FROM table1 WHERE nomre in(SELECT DISTINCT nomre FROM table1 ORDER BY nomre DESC LIMIT 0,3 )

idocsidocs
سه شنبه 13 دی 1390, 11:45 صبح
SELECT * FROM table1 WHERE nomre in(SELECT DISTINCT nomre FROM table1 ORDER BY nomre DESC LIMIT 0,3 )
بنظرم همین کوئری مشکل رو برطرف می کنه.