php/mysql - Συνθετη φορμα αξιολογησης προιοντων

Σε αυτή την περιοχή μπορείτε να βρείτε ή να αναζητήσετε πληροφορίες σχετικές με την PHP

Συντονιστές: WebDev Moderators, Super-Moderators, PHP Moderators

Απάντηση
Άβαταρ μέλους
Christianago
Δημοσιεύσεις: 332
Εγγραφή: 12 Νοέμ 2009 13:36

php/mysql - Συνθετη φορμα αξιολογησης προιοντων

Δημοσίευση από Christianago » 10 Αύγ 2011 19:39

Καλησπερα. Εχω ενα συνθετο προβλημα να λυσω σε php, το οποιο αποτελειται απο διαφορα υπο-προβληματα. Καθε βοηθεια σας ειναι πολυτιμη.
Προσπαθω μεσα σε 1 φορμα να εμφανισω στο χρηστη ενα συνολο ας πουμε απο προιοντα ενος πινακα στη mysql και να τα αξιολογει.
Η αξιολογηση γινεται για καθε προιον συγκριτικα με ολα τα υπολοιπα. Δηλ. εαν ενας πινακας εχει 3 προιοντα, πρεπει να παραχθουν ολοι οι δυνατοι συνδυασμοι:

Κώδικας: Επιλογή όλων

προιον 1 versus προιον 2 [input type text => enter value]
προιον 1 versus προιον 3 [input type text => enter value]
προιον 2 versus προιον 3 [input type text => enter value]
Η παραπανω συγκριση ειναι απλη, αλλα το συνολο των προιοντων σε καθε πινακα δεν το ξερω. Θελω να κανω κατι σαν καρτεσιανο γινομενο, αλλα για 1 πινακα.
Αφου καταφερω και λυσω αυτο πρεπει να αποθηκευσω τις αξιολογησεις των προιοντων σε μια αλγεβρικη μητρα ή αλλιως σε ενα 2d array.
Δηλαδη καπως ετσι:

Κώδικας: Επιλογή όλων

         Προιον1  Προιον2  Προιον3
Προιον1  1/1	    2/1      3/1
Προιον2  1/2	    1/1      4/1
Προιον3  1/3 	   1/4      1/1
οπου η αριστερη διαγωνιος ειναι παντα 1, ενω τα υπολοιπα στοιχεια του πινακα αντιπροσωπευουν τις αξιολογησεις των προιοντων μεταξυ τους.
Για παραδειγμα κοιτωντας απο αριστερα το προιον 3 εχει αξιολογηση 4 φορες χειροτερη απο το προιον 2,
ενω το προιον 1 εχει 3 φορες καλυτερη αξιολογηση απο το προιον 3.
Παρολο που καταφερνω να παραγω τους συνδυασμους των προιοντων δημιουργωντας προσωρινους πινακες στη βαση δεδομενων,
δεν ξερω πώς να ονοματισω τα πεδια κειμενου ετσι ωστε να τα παρω δυναμικα μεσω POST στην php.

Αυτο στην ουσια ειναι το προβλημα μου. Προς στιγμην παιζω με php/mysql. Δεν ξερω αν θα βοηθουσε περισσοτερο κατι προς ajax ή κατι αλλο.

Άβαταρ μέλους
jpk
Δημοσιεύσεις: 441
Εγγραφή: 09 Μαρ 2011 21:17

php/mysql - Συνθετη φορμα αξιολογησης προιοντων

Δημοσίευση από jpk » 11 Αύγ 2011 01:00

Δεν ξέρω αν το κατάλαβα καλά το πρόβλημα που έχεις, αλλά περισσότερο θέμα σχεδιασμού βάσης μου κάνει , μετά αρχιτεκτονικής και τελευταία αλγορίθμων.

Απλά για να καταλάβω πριν σου πω και την δική μου εξυπνάδα (είπαμε … είμαι αργός) στο enter value που λες τι τιμές μπορεί να βάλει κάποιος και τι ακριβώς σημαίνουν αυτές. Π.χ. αν βάλω 5 στο προιον 1 versus προιον 2 [input type text => enter value] σημαίνει ότι «ψηφίζω» ότι το προϊόν 1 είναι 5 φορές καλλίτερο από το προϊόν 2 ;

Επίσης αυτό που λες για «όλοι οι δυνατοί συνδυασμοί» είναι εξορισμού ή κάποιος μπορεί να επιλέξει να «βαθμολογήσει συγκριτικά» κάποιους από αυτούς τους συνδυασμούς;

Και τέλος λες ότι θέλεις να πάρεις κάτι (όχι να εισάγεις) μέσα από Post … τι είναι αυτό που θέλεις να παίρνεις κάθε φορά σε σχέση με ποια δεδομένα που σου έρχονται από post;

Άβαταρ μέλους
Christianago
Δημοσιεύσεις: 332
Εγγραφή: 12 Νοέμ 2009 13:36

php/mysql - Συνθετη φορμα αξιολογησης προιοντων

Δημοσίευση από Christianago » 11 Αύγ 2011 01:49

Ναι μπλεκει και σχεδιασμο και αρχιτεκτονικη και αλγοριθμους.
Τα ανεφερα ολα αυτα γιατι καποιος μπορει να να βοηθησει μονο στον τομεα που ξερει.
Διαλεξα συνθετο προβλημα αυτη τη φορα γιατι θελω να δοκιμασω (την αντοχη σας πολυ πιθανον...) τι μαθατε ολο αυτον τον καιρο στο web programming !:P
Π.χ. αν βάλω 5 στο προιον 1 versus προιον 2 [input type text => enter value] σημαίνει ότι «ψηφίζω» ότι το προϊόν 1 είναι 5 φορές καλλίτερο από το προϊόν 2 ;
Ακριβως. Βεβαια ξεχασα να προσθεσω στη φορμα να επιλεγει ο χρηστης ποιο απο τα 2 προιοντα ειναι καλυτερο ή χειροτερο.
Επίσης αυτό που λες για «όλοι οι δυνατοί συνδυασμοί» είναι εξορισμού ή κάποιος μπορεί να επιλέξει να «βαθμολογήσει συγκριτικά» κάποιους από αυτούς τους συνδυασμούς;
Εννοεις αν επιτρεπεται ο χρηστης να αφησει καποιες συγκρισεις προιοντων αβαθμολογητες;
τι είναι αυτό που θέλεις να παίρνεις κάθε φορά σε σχέση με ποια δεδομένα που σου έρχονται από post;
Θελω να παιρνω ποιο προιον νικησε στη συγκριση, και με ποση βαθμολογια.
Υστερα να αποθηκευεται σε ενα πολυ ωραιο 2D array, το οποιο δεν εχω καμια ιδεα πώς να το κανω διοτι το μεγεθος του ειναι δυναμικο αναλογα με το πληθος των προιοντων.

Άβαταρ μέλους
jpk
Δημοσιεύσεις: 441
Εγγραφή: 09 Μαρ 2011 21:17

php/mysql - Συνθετη φορμα αξιολογησης προιοντων

Δημοσίευση από jpk » 11 Αύγ 2011 10:16

Άκουσε μια ιδέα
Ας υποθέσουμε ότι η συγκριτική βαθμολόγηση γίνεται βάση μια συγκεκριμένη κλίμακα (π.χ. από -5 έως 5) όπου στο προίόν 1 vs προϊόν 2 το -5 σημαίνει ότι το προϊόν 1 είναι 5 φορές καλλίτερο από το προϊόν 2 και το 5 το ανάποδο. Φυσικά δεν ξαναβγάζεις το ζευγάρι ανάποδα π.χ. προϊόν 2 vs προϊόν 1 γιατί ήδη έχεις αυτή την σύγκριση, όπως επίσης δεν βγάζεις ίδια ζευγάρια (π.χ. προϊόν 2 vs προϊόν 2).

Αν υποθέσουμε ότι κάθε προϊόν έχει ένα ID στον πίνακα τότε αμέσως έχεις έναν πίνακα συγκριτικών βαθμολογιών (με π.χ. ID , PRODUCT_A_ID , PRODUCT_B_ID , RATE ). Για ευκολία τα inputs των συγκριτικών βαθμολογιών θα μπορούσαν να εμπεριέχουν τα ids των προϊόντων π.χ. rate_23_54 (σημαίνει η συγκριτική βαθμολογία του προϊόντος με ID 23 vs εκείνου με ID 54). Έτσι αμέσως παίρνεις από το post τα κλειδιά που αρχίζουν με rate_ και είσαι έτοιμος για να αποθηκεύσεις τα δεδομένα (να προσθέσεις το rate αν υπάρχει ήδη ή να προσθέσεις row στον πίνακα).

Αφού έχεις αυτόν τον πίνακα το θέμα είναι η εμφάνιση των αποτελεσμάτων που μπορείς να την κάνεις με πάρα πολλούς τρόπους. Εγώ θα χρησιμοποιούσα λίστα αντικειμένων αλλά αν επιλέξεις ένα απλό 2d array τότε αυτό είναι $rate[PRODUCT_A_ID][PRODUCT_B_ID] = $value ($rate[PRODUCT_B_ID][PRODUCT_A_ID] = -$value) και επειδή τα IDs δεν λένε τίποτα σε κανένα έχεις ήδη πάρει τους τίτλους των προϊόντων ανά ID ώστε να κάνεις τις λεκτικές αντικαταστάσεις.

Όπως είπα αυτό είναι απλά μια ιδέα….

Άβαταρ μέλους
Christianago
Δημοσιεύσεις: 332
Εγγραφή: 12 Νοέμ 2009 13:36

php/mysql - Συνθετη φορμα αξιολογησης προιοντων

Δημοσίευση από Christianago » 11 Αύγ 2011 12:40

Ας υποθέσουμε ότι η συγκριτική βαθμολόγηση γίνεται βάση μια συγκεκριμένη κλίμακα (π.χ. από -5 έως 5) όπου στο προίόν 1 vs προϊόν 2 το -5 σημαίνει ότι το προϊόν 1 είναι 5 φορές καλλίτερο από το προϊόν 2 και το 5 το ανάποδο. Φυσικά δεν ξαναβγάζεις το ζευγάρι ανάποδα π.χ. προϊόν 2 vs προϊόν 1 γιατί ήδη έχεις αυτή την σύγκριση, όπως επίσης δεν βγάζεις ίδια ζευγάρια (π.χ. προϊόν 2 vs προϊόν 2).
Πρεπει αναγκαστικα να εχω θετικη βαθμολογηση, ενω τις συγκρισεις προιοντων τις θελω 2 φορες στον πινακα, γιατι αμα θυμασαι σε προηγουμενο θεμα μου, δημιουργω μια μητρα που υστερα την πολ/ζω με τον εαυτο της. Επομενως βαζω και τα ζευγαρια αναποδα. Αυτο μπορει να γινει ως εξης: διαιρω τη βαθμολογηση ενος ζευγαριου απο το 1, π.χ 1/3.
Αν υποθέσουμε ότι κάθε προϊόν έχει ένα ID στον πίνακα τότε αμέσως έχεις έναν πίνακα συγκριτικών βαθμολογιών (με π.χ. ID , PRODUCT_A_ID , PRODUCT_B_ID , RATE ). Για ευκολία τα inputs των συγκριτικών βαθμολογιών θα μπορούσαν να εμπεριέχουν τα ids των προϊόντων π.χ. rate_23_54 (σημαίνει η συγκριτική βαθμολογία του προϊόντος με ID 23 vs εκείνου με ID 54). Έτσι αμέσως παίρνεις από το post τα κλειδιά που αρχίζουν με rate_ και είσαι έτοιμος για να αποθηκεύσεις τα δεδομένα (να προσθέσεις το rate αν υπάρχει ήδη ή να προσθέσεις row στον πίνακα).
Μπορεις να μου δωσεις ενα παραδειγμα με ενα POST; Ψιλοκαταλαβαινω τι λες παντως.
Αφού έχεις αυτόν τον πίνακα το θέμα είναι η εμφάνιση των αποτελεσμάτων που μπορείς να την κάνεις με πάρα πολλούς τρόπους. Εγώ θα χρησιμοποιούσα λίστα αντικειμένων αλλά αν επιλέξεις ένα απλό 2d array τότε αυτό είναι $rate[PRODUCT_A_ID][PRODUCT_B_ID] = $value ($rate[PRODUCT_B_ID][PRODUCT_A_ID] = -$value) και επειδή τα IDs δεν λένε τίποτα σε κανένα έχεις ήδη πάρει τους τίτλους των προϊόντων ανά ID ώστε να κάνεις τις λεκτικές αντικαταστάσεις.
Κι απο αυτο θα ηθελα ενα παραδειγμα.

Άβαταρ μέλους
jpk
Δημοσιεύσεις: 441
Εγγραφή: 09 Μαρ 2011 21:17

php/mysql - Συνθετη φορμα αξιολογησης προιοντων

Δημοσίευση από jpk » 11 Αύγ 2011 18:54

Επισυνάπτω παράδειγμα. Δεν είχα ακριβώς τα specs της συγκριτικής βαθμολόγησης οπότε έβαλα ότι έχω ήδη καταλάβει.

Είναι το test.php και είναι μια ιδέα για το πώς γίνεται (θα μπορούσαν να υπάρχουν άπειρες άλλες). Έχω απλοποιήσει πολλά σε επίπεδο αρχιτεκτονικής (π.χ. δεν είναι η MVC αρχιτεκτονική που χρησιμοποιώ) και έχω επικεντρωθεί σε αυτά που ρωτάς…
Συνημμένα
matrixRate.zip
(13.45 KiB) Μεταφορτώθηκε 494 φορές

Άβαταρ μέλους
Christianago
Δημοσιεύσεις: 332
Εγγραφή: 12 Νοέμ 2009 13:36

php/mysql - Συνθετη φορμα αξιολογησης προιοντων

Δημοσίευση από Christianago » 11 Αύγ 2011 20:00

Πολυ υλικο ειδα οτι μου εδωσες ευχαριστω πρωτα απο ολα!
Μου βγαζει σφαλμα οτι και καλα δεν υπαρχει ο πινακας products. Η ΒΔ που πρεπει να δημιουργησω υπαρχει παντως.

Άβαταρ μέλους
jpk
Δημοσιεύσεις: 441
Εγγραφή: 09 Μαρ 2011 21:17

php/mysql - Συνθετη φορμα αξιολογησης προιοντων

Δημοσίευση από jpk » 11 Αύγ 2011 20:55

Ξεχάστηκα και δεν έγραψα ότι πρέπει να κάνεις εισαγωγή από αρχείο το test_matrixrate.sql που υπάρχει στο ίδιο zip στην βάση. Πάντως το αν βαθμολογείς συγκριτικά τα προϊόντα διαφορετικά το να αλλάξεις τον τρόπο βαθμολόγησης είναι αρκετά απλό.

Άβαταρ μέλους
Christianago
Δημοσιεύσεις: 332
Εγγραφή: 12 Νοέμ 2009 13:36

php/mysql - Συνθετη φορμα αξιολογησης προιοντων

Δημοσίευση από Christianago » 11 Αύγ 2011 21:13

Οκ το φορτωσα το sql δουλευει μια χαρα. Εντυπωσιακο πρωτα απο ολα αυτο που εκανες σε τοσο λιγο χρονο μαλιστα!!
Βοηθαει πρωτα η εισαγωγη στη ΒΔ και μετα η φορτωση σε array. Κι εγω κατι τετοιο σκεφτομουν, αλλα φαινεται εσυ το υλοποιησες πρωτος.
Θα το μελετησω λιγο θελω το χρονο μου καθως δεν ειμαι και πολυ expert :P

Άβαταρ μέλους
Christianago
Δημοσιεύσεις: 332
Εγγραφή: 12 Νοέμ 2009 13:36

php/mysql - Συνθετη φορμα αξιολογησης προιοντων

Δημοσίευση από Christianago » 11 Αύγ 2011 22:10

Λοιπον φιλε μου πλησιαζουμε, καταλαβες σχεδον αμεσως αυτο που θελω.
Παρατηρησα οτι ειτε προσθετω ειτε αφαιρω προιοντα, η βαθμολογηση γινεται χωρις προβληματα ειναι πολυ θετικο αυτο.
Μετα ειδα οτι καθε βαθμολογηση γινεται αθροιστικα με καθε προηγουμενη βαθμολογηση για καθε ζευγος προιοντων.
Τωρα αν θελω να τα αλλαξω αυτο, πώς το κανω;
Δηλ. θελω καθε φορα η βαθμολογια των προιοντων να διαμορφωνεται εκ νεου χωρις να αποθηκευονται οι προηγουμενες τιμες.
Βεβαια εχει νοημα αυτο με τις αρνητικες τιμες που εχεις κανει, αλλα μπορει να μην ειναι αρκετα κατανοητο απο το χρηστη γι αυτο και θα προσπαθησω να το αλλαξω μονος μου.
Επισης να μου πεις τι χρειαζεται για να το ενσωματωσω αυτο στη σελιδα μου.

Άβαταρ μέλους
jpk
Δημοσιεύσεις: 441
Εγγραφή: 09 Μαρ 2011 21:17

php/mysql - Συνθετη φορμα αξιολογησης προιοντων

Δημοσίευση από jpk » 11 Αύγ 2011 23:23

* Σημείωση που το είδα τώρα , λέω δύο φορές $productsAssigner ενώ την δεύτερη φορά για να έχει λεκτικό νόημα έπρεπε να το πω ratesAssigner το instance.

Αν δεν θέλεις να αποθηκεύονται οι τιμές δεν χρειάζεσαι ούτε τον πίνακα rates ούτε την RatesAssigner ούτε την RatesDataWorker. Οπότε βγάζεις και το instance της RatesAssigner. Εκεί που κανονικά δημιουργεί την λίστα αντικειμένων από την βάση ($ratesList = $productsAssigner->getList(); - όπου θα έπρεπε να έχει όνομα το instance $ratesAssigner) απλά δημιουργείς καινούργιο αντικείμενο λίστας αντικειμένων και του βάζεις μοναδικό κλειδί το ratesVsIndex.

Κώδικας: Επιλογή όλων

$ratesList = new ObjectsList();
$ratesList->addKey("ratesVsIndex",ObjectsList::$uniqueMode);
Οπότε δημιουργούμε μια νέα μέθοδο στην RatesOperation

Κώδικας: Επιλογή όλων

	/**
	 * Προσθέτει αντικείμενα τύπου Rate στην λίστα αντικειμένων συσχετιστικών βαθμολογιών 
	 */
	/**
	 * Προσθέτει αντικείμενα τύπου Rate στην λίστα αντικειμένων συσχετιστικών βαθμολογιών 
	 */
	public function setTempRatesFromForm()
	{
				//Τα δεδομένα έχουν σταλεί από την φόρμα με την μορφή rate_34vs31 που σημαίνει ότι βαθμολογείται το προϊόν 34 σχετικά με το προϊόν 31.
		$formRates = $this->getPostList("rate");
		
		if($formRates != null)
		{
			foreach($formRates as $key => $value)
			{
				if($value != 0)
				{
					// Τα ids των αντικειμένων που συγκρίνονται
					$productIds = explode("vs",$key);
					$o = new Rate(); 
					$o->setFirstProductId($productIds[0]);
					$o->setSecondProductId($productIds[1]); 
					$o->setRate($value);
					$o->setRatesVsIndex($key); 
					$this->ratesList->add($o);
				}
			}			
		}		
	}
Και αντί για $ratesOperation->updateRatesFromForm($db);
Λες $ratesOperation->setTempRatesFromForm();

Βέβαια αυτός ο τρόπος που εξήγησα δομήθηκε με βάση ότι κρατάς τις τιμές συγκριτικής βαθμολόγησης αλλά μπορεί και να χρησιμοποιηθεί και χωρίς να τις κρατάς .
Christianago έγραψε: Βεβαια εχει νοημα αυτο με τις αρνητικες τιμες που εχεις κανει, αλλα μπορει να μην ειναι αρκετα κατανοητο απο το χρηστη γι αυτο και θα προσπαθησω να το αλλαξω μονος μου.
Όντως αυτό με τα select με αρνητική συγκριτική βαθμολόγηση δύσκολα το καταλαβαίνει χρήστης. Το πιο φιλικό για εμέ θα ήταν να υπήρχε μια μπάρα πάνω από κάθε ζευγάρι προϊόντων που σέρνοντας την προς την μια μεριά ή προς την άλλη να έδινες αυτές τις τιμές. Αυτό είναι JavaScript με DOM και μπορείς να πειραματιστείς.
Christianago έγραψε: Επισης να μου πεις τι χρειαζεται για να το ενσωματωσω αυτο στη σελιδα μου.
Αυτό φίλε μου το ξέρεις εσύ. Από την στιγμή που σου τρέχει και έχεις αντίληψη τι κάνει τότε εσύ ξέρεις πως θα το βάλεις στο project σου (δεν έχει πάντως τίποτα κρυφό ή μπερδεμένο ότι χρειάζεται για require τα κάνει στην test.php).

Πάντως όπως σου είπα αυτό ήταν μόνο μια ιδέα (η οποία όμως είχε βασιστεί ότι κρατάς τις τιμές των συγκριτικών βαθμολογήσεων) . Σίγουρα θα υπάρχουν και πολλές άλλες λύσεις.

Απάντηση

Επιστροφή στο “PHP Προγραμματισμός”

Μέλη σε σύνδεση

Μέλη σε αυτήν τη Δ. Συζήτηση: Δεν υπάρχουν εγγεγραμμένα μέλη και 0 επισκέπτες