2011-05-28 13 views
5

मैं ऐसे डेटाबेस पर काम कर रहा हूं जो कॉलेज के छात्रों के परीक्षा परिणामों में हेरफेर करता है। असल में, मैं किसी भी समय किसी वर्ग को एक वर्ग को पंसाने, एक MySQL डेटाबेस से रिकॉर्ड खींच रहा हूं। मैं छात्रों को रैंक रैंक करना चाहता हूं, उच्चतम परफॉर्मर के साथ नंबर 1 पर यहां एक उदाहरण है;मैं सरणी मानों को डुप्लिकेट मानों के साथ कैसे रैंक करूं और टाई होने पर कुछ स्थितियों को छोड़ूं?

Marks: 37, 92, 84, 83, 84, 65, 41, 38, 38, 84. 

तो मैं एक ही सरणी के रूप में mysql डेटा को कैप्चर करना चाहता हूं। एक बार मेरे पास एक सरणी में डेटा हो जाने के बाद, मुझे प्रत्येक छात्र को कक्षा में एक स्थिति जैसे 1/10 (संख्या 1, 92 स्कोर), 4/10 आदि असाइन करना चाहिए। अब समस्या यह है कि यदि कोई टाई है, तो अगला स्कोर एक स्थिति छोड़ देता है और यदि एक स्थिति में 3 अंक हैं तो अगला स्कोर 2 पदों को छोड़ देता है। तो ऊपर दिए गए स्कोर निम्नानुसार रैंक किए जाएंगे;

92 - 1 
84 - 2, 
84 - 2, 
84 - 2, 
83 - 5, 
65 - 6, 
41 - 7, 
38 - 8, 
38 - 8 , 
37 - 10 

ग्रेडिंग प्रणाली है कि पदों की संख्या (रैंक, यदि आप होगा) को बनाए रखा जाएगा, इसलिए हम 10 पदों के साथ इस वर्ग में पदों 3, 4, 5 के बाद से समाप्त हो गया और 9 किसी भी नहीं था की आवश्यकता है रहने वालों। (प्रत्येक नंबर को भरने का विकल्प हमें केवल 8 पदों देगा!)

क्या यह संभव है (मानव संभवतः संभव/PHP संभव) PHP का उपयोग करने के लिए इस तरह से स्कोर को रैंक करने के लिए संभव है कि यह संभावित संबंधों को संभाल सके एक अंक पर 4 अंक? धीरे-धीरे, मैं ऐसा करने के लिए एक समारोह के साथ नहीं आ सकता था। मुझे एक PHP फ़ंक्शन (या कुछ ... PHP) चाहिए जो एक सरणी लेगा और उपरोक्त रैंकिंग का उत्पादन करेगा।

किसी भी मदद की सराहना की जाएगी, हालांकि मुझे लगता है कि मैं बहुत ज्यादा पूछ रहा हूं। यदि यह किसी सरणी में किए बिना MySQL क्वेरी डेटा के साथ ऐसा करना संभव है, तो यह भी सहायक होगा!

उत्तर

5

मैं ग्रेड पहले से ही डेटाबेस से हल कर रहे हैं मान, अन्यथा sort($grades); का उपयोग करें।

कोड:

$grades = array(92, 84, 84, 84, 83, 65, 41, 38, 38, 37); 
$occurrences = array_count_values($grades); 
$grades = array_unique($grades); 
foreach($grades as $grade) { 
    echo str_repeat($grade .' - '.($i+1).'<br>',$occurrences[$grade]); 
    $i += $occurrences[$grade]; 
} 

परिणाम:

92 - 1 
84 - 2 
84 - 2 
84 - 2 
83 - 5 
65 - 6 
41 - 7 
38 - 8 
38 - 8 
37 - 10 

संपादित(नीचे चर्चा के जवाब)

जाहिर है, इस मामले में टाई होता है एक टी सबसे कम स्कोर,
सभी निम्नतम स्कोरों की रैंक स्कोर की कुल गणना के बराबर होना चाहिए।

कोड:

$grades = array(92, 84, 84, 84, 83, 65, 41, 38, 37, 37); 
$occurrences = array_count_values($grades); 
$grades = array_unique($grades); 
foreach($grades as $grade) { 
    if($grade == end($grades))$i += $occurrences[$grade]-1; 
    echo str_repeat($grade .' - '.($i+1).'<br>',$occurrences[$grade]); 
    $i += $occurrences[$grade]; 
} 

परिणाम:

92 - 1 
84 - 2 
84 - 2 
84 - 2 
83 - 5 
65 - 6 
41 - 7 
38 - 8 
37 - 10 
37 - 10 
+0

टाई अंत में होने तक यह बहुत अच्छी तरह से काम करता है। उस स्थिति में अंतिम स्कोर (जो टाई) को सौंपी गई स्थिति स्कोर की कुल संख्या के बराबर नहीं होगी। उपर्युक्त आउटपुट में आप देखेंगे कि स्कोर 37 नंबर 10 पर स्थित है, जो कि सबसे कम स्कोर है और यह छात्रों की कुल संख्या होने के कारण हानिकारक है। हालांकि, हमारे पास 37 (सबसे कम स्कोर) पर टाई है और 38 नहीं, पिछले दो स्कोर 10 के बजाय स्थिति 9 को सौंपा जाएगा। मुझे लगता है कि एक सशर्त की आवश्यकता है जो जांचता है कि टाई में सबसे कम स्कोर शामिल है, मैं इस तरह के एक सशर्त – Bululu

+0

जोड़ने की कोशिश कर रहे हैं मान लें कि हमारे पास निम्न सरणी है: '$ ग्रेड = सरणी (92, 84, 84, 84, 83, 65, 41, 38, 37,37); '' 37' दोनों में दिखाया गया है परिणाम '37 - 9', जो सही है क्योंकि पहले' 37' वास्तव में नौवीं स्थिति में स्थित है। निष्कर्ष में: जब टाई निम्नतम ग्रेड पर होती है, तो प्रत्येक निम्न ग्रेड के लिए रैंक निम्नतम ग्रेड की पहली घटना के रैंक के बराबर होता है। इस मामले में '9'। सही? – Anne

+0

मुझे लगता है कि आपके कोड को समस्या को हल करना चाहिए जैसा कि यह है। तर्क यह सुनिश्चित कर रहा है कि अंतिम स्कोर परीक्षा के लिए बैठे छात्रों की संख्या के बराबर हो, कुछ हद तक त्रुटिपूर्ण है। यदि टाई कहीं भी होती है लेकिन अंत में, निम्नतम स्कोर छात्रों की कुल संख्या के बराबर होगा। यदि यह अंत में है जो नहीं हो सकता है, और IU tyou bec ause से सहमत है, तो दूसरा सबसे कम स्कोरर कहता है, 9 उदाहरण के रूप में, तो अगले स्कोरर को सही स्थिति मिलनी चाहिए SINCE के बाद कोई स्कोर नहीं है उस। इस बीच इस जवाब के लिए बहुत बहुत धन्यवाद, आप एक प्रतिभाशाली हैं! – Bululu

1
$scores = array(92, 84, 84, 84, 83, 65, 41, 38, 38, 37); 
$ranks = array(1); 
for ($i = 1; $i < count($scores); $i++) 
{ 
    if ($scores[$i] != $scores[$i-1]) 
     $ranks[$i] = $i + 1; 
    else 
     $ranks[$i] = $ranks[$i-1]; 
} 
print_r($ranks); 
+0

@ बुलुलु stuken.yuri कोड के अतिरिक्त के रूप में, मैं इंगित करता हूं कि आप डेटाबेस से डेटा पहले ही ऑर्डर कर सकते हैं, इसलिए आपको इसे php फ़ंक्शंस के माध्यम से सॉर्ट करने की आवश्यकता नहीं है। – koressak

+0

मैं क्वेरी में कुछ पैरामीटर जोड़कर इसे mysql से ऑर्डर करने में सक्षम हूं। क्या आप कह रहे हैं कि मेरे प्रश्न में बताए गए आंकड़ों को एक हद तक इस्तेमाल किया जा सकता है? टाई के मामले में कुछ पद छोड़ना? यह एक आवश्यकता है जिसे मैंने एक प्रश्न में डीईएससी या एएससी द्वारा आदेश जोड़कर हासिल नहीं किया जा सकता है। मैं खुश रहूंगा यदि आप विस्तृत कर सकते हैं कि मैं एक प्रश्न का उपयोग करके इस उच्च डिग्री के क्रैंकिंग को कैसे प्राप्त कर सकता हूं। – Bululu

+0

यूरी, आपको बहुत धन्यवाद, आपका समाधान भी समस्या हल करता है। – Bululu

0

मैं मूल्यों का एक नक्शा रैंक करने के लिए अंत की जरूरत है। यह विधि मूल प्रश्न के लिए भी अधिक कुशल हो सकती है।

public static function getGrades($grades) 
{ 
    $occurrences = array_count_values($grades); 
    krsort($occurrences); 

    $position = 1; 
    foreach ($occurrences as $score => $count) { 
     $occurrences[$score] = $position; 
     $position += $count; 

    } 

    return $occurrences; 
} 

आप $ पर print_r तो घटनाओं आप

Array 
(
    [92] => 1 
    [84] => 2 
    [83] => 5 
    [65] => 6 
    [41] => 7 
    [38] => 8 
    [37] => 10 
) 

मूल जवाब के आधार पर मिलता है, इसलिए धन्यवाद!

संबंधित मुद्दे