t(o.ot) Δημοσ. 11 Νοεμβρίου 2014 Δημοσ. 11 Νοεμβρίου 2014 (επεξεργασμένο) $string = "He's reading the newspaper. He can't believe what the world was coming to. He'll never buy a newspaper again."; $wordCount =str_word_count(strtolower($string), 1); $_wordCount = array(); $stopwatch = array( "a", "the", "to" ); foreach ($wordCount as $word) { if (substr($word, -2) === "'s") { $_word = substr($word, 0, -2); } elseif (substr($word, -3) === "n't") { $_word = substr($word, 0, -3); } elseif (substr($word, -3) === "'ll") { $_word = substr($word, 0, -3); } else { $_word = $word; } if (!in_array($_word, $stopwatch)) { $_wordCount[] = $_word; } } $_wordCount = array_count_values($_wordCount); arsort($_wordCount); print_r($_wordCount); Δοκίμασε αυτό. Ακόμα έχεις πρόβλημα με κάποια ανώμαλα όπως το can't που γίνεται ca. Μπορείς πάντα να βάλεις τις εξαιρέσεις που θα βρίσκεις σε ένα array και να τσεκάρεις τη $word με in_array. Επεξ/σία 11 Νοεμβρίου 2014 από t(o.ot)
rafinos Δημοσ. 11 Νοεμβρίου 2014 Μέλος Δημοσ. 11 Νοεμβρίου 2014 Μπορείς να μου εξηγήσεις αυτό; $_word = (substr($word, -3) === "n't")? substr($word, 0, -3) : (substr($word, -3) === "'ll")? substr($word, 0, -3) : (substr($word, -2) === "'s")? substr($word, 0, -2) : Oκ κατάλαβα τι κάνει Θα δοκιμάσω και θα σου πω!
t(o.ot) Δημοσ. 11 Νοεμβρίου 2014 Δημοσ. 11 Νοεμβρίου 2014 Nested ternary operator και τώρα που το βλέπω δε θα δουλέψει (you gotta love PHP). Ετοιμάζω edit.
rafinos Δημοσ. 11 Νοεμβρίου 2014 Μέλος Δημοσ. 11 Νοεμβρίου 2014 Οκ δουλεύει! Από ότι κατάλαβα γαι να φτιάξεις κάτι τέτοιο και να δουλέψει τέλεια (αν γίνεται) πρέπει να έχεις μια μηχανή και να μαθαίνει λέξεις Πάντως αυτό που είπες με λέξεις όπως το "ca" πιθανότατα να λυθεί καθώς έχω σκοπό να μην αφήνω τις λέξεις που έχουν length μικρότερο του 4 να περνάνε στον πίνακα. Το θέμα είναι ότι δεν ορίζω εγώ τι θα πρέπει να γίνει και τι όχι... και δυστυχώς τα μαθαίνω ένα ένα και εγώ (ότι χειρότερο δηλαδή) για αυτό όσο πάει αλλάζω και τα λεγόμενα μου και σας τα κάνω χειρότερα. Ευχαριστώ πολύ (ε λογικά αύριο μεθαύριο θα σας πρίξω πάλι )
t(o.ot) Δημοσ. 11 Νοεμβρίου 2014 Δημοσ. 11 Νοεμβρίου 2014 Οκ, έχε απλά υπ' όψιν πως αυτή η λύση είναι τραγική όσον αφορά στην ταχύτητα, ειδικά αν πρόκειται να εκτελείς τον κώδικα πολύ συχνά ή/και αν μεγαλώσουν τα arrays πολύ (πχ αν ρίξεις λογοτεχνικό βιβλίο ή ρίξεις μερικές χιλιάδες λέξεις σαν stopwatches). Μπορείς πάντα να αντιστρέψεις κλειδιά και τιμές στο stopwatches array και να αντικαταστήσεις την in_array με isset.
defacer Δημοσ. 13 Νοεμβρίου 2014 Δημοσ. 13 Νοεμβρίου 2014 Oκ κατάλαβα τι κάνει Καλή φάση που κατάλαβες, αλλά ποτέ μη κάνεις τέτοιο πράγμα στην πράξη. Αυτά είναι καγκουριές. Χίλιες φορές καλύτερα το if/elseif. Ακόμα και reverse switch θα ήταν προτιμότερο. Νομίζω πως αν συνδυάσεις το regex που έδωσα νωρίτερα με κάτι απλό και κατανοητό όπως αυτό θα είσαι OK: $suffixes = ["n't", "'ll", "'s"]; $words = ... // βγάζεις τα suffixes foreach ($words as $key => $word) { foreach($suffixes as $suffix) { if(substr($word, -strlen($suffix)) === $suffix) { $words[$key] = substr($word, 0, -strlen($suffix)); } } } // και μετά πολύ απλά $words = array_diff($words, $stopwords); Απο κει και πέρα υπάρχουν πολλοί εναλλακτικοί τρόποι να γράψεις το διπλό foreach. Εγώ πιθανόν να προτιμούσα κάτι τέτοιο: $regex = '/'.implode('|', $suffixes).'$/'; $words = array_map(function($word) use ($regex) { return preg_replace($regex, '', $word); }, $words); 2
t(o.ot) Δημοσ. 13 Νοεμβρίου 2014 Δημοσ. 13 Νοεμβρίου 2014 Καλή φάση που κατάλαβες, αλλά ποτέ μη κάνεις τέτοιο πράγμα στην πράξη. Αυτά είναι καγκουριές. Χίλιες φορές καλύτερα το if/elseif. Ακόμα και reverse switch θα ήταν προτιμότερο. Elaborate please. Έχει να κάνει με την PHP μόνο το σχόλιό σου ή γενικά με τα nested ternaries; Κατά τ' άλλα, η λύση με το closure είναι η καλύτερη λύση ως τώρα, αρκεί να τρέχεις σε PHP 5.3 και πάνω.
defacer Δημοσ. 13 Νοεμβρίου 2014 Δημοσ. 13 Νοεμβρίου 2014 Elaborate please. Έχει να κάνει με την PHP μόνο το σχόλιό σου ή γενικά με τα nested ternaries; Με τα nested ternaries και γενικότερα με όλο τον κώδικα που είναι "too smart for its own good". Παλιότερα ενθουσιαζόμουν με τρόπους να γραφτεί κάποιος σε λιγότερες γραμμές, σε ένα μόνο statement, κλπ κλπ. Τώρα ξέρω ότι το ζητούμενο από τον κώδικα είναι να γίνεται άμεσα κατανοητός στον αναγνώστη, όχι να τον βλέπεις και να χαίρεσαι "look ma no semicolons". Έκανα ένα γρήγορο search για δικά μου παραδείγματα που είναι σ' αυτή την κατηγορία: http://stackoverflow.com/questions/22351105/sorting-a-complex-multi-dimensional-array-put-blank-value-at-bottom/22351416#22351416 http://stackoverflow.com/questions/17473879/sort-array-digits-special-chars-letters/17474164#17474164 http://stackoverflow.com/questions/7388211/how-to-efficiently-count-the-number-of-defined-pointers/7388235#7388235 PS: Η 5.3 κυκλοφόρησε πριν 5 χρόνια και έχει ήδη γίνει EOLed. Δεν υπάρχει περίπτωση να τρέχει οτιδήποτε λιγότερο. Ακόμα και το debian stable τρέχει 5.4.
rafinos Δημοσ. 13 Νοεμβρίου 2014 Μέλος Δημοσ. 13 Νοεμβρίου 2014 Καλή φάση που κατάλαβες, αλλά ποτέ μη κάνεις τέτοιο πράγμα στην πράξη. Αυτά είναι καγκουριές. Χίλιες φορές καλύτερα το if/elseif. Ακόμα και reverse switch θα ήταν προτιμότερο. Νομίζω πως αν συνδυάσεις το regex που έδωσα νωρίτερα με κάτι απλό και κατανοητό όπως αυτό θα είσαι OK: $suffixes = ["n't", "'ll", "'s"]; $words = ... // βγάζεις τα suffixes foreach ($words as $key => $word) { foreach($suffixes as $suffix) { if(substr($word, -strlen($suffix)) === $suffix) { $words[$key] = substr($word, 0, -strlen($suffix)); } } } // και μετά πολύ απλά $words = array_diff($words, $stopwords); Απο κει και πέρα υπάρχουν πολλοί εναλλακτικοί τρόποι να γράψεις το διπλό foreach. Εγώ πιθανόν να προτιμούσα κάτι τέτοιο: $regex = '/'.implode('|', $suffixes).'$/'; $words = array_map(function($word) use ($regex) { return preg_replace($regex, '', $word); }, $words); Όπως κάθε φορά έτσι και αυτή ευχαριστώ! Επίσης φυσικά και δουλεύει ολόσωστα! *Δίνει το ίδιο αποτέλεσμα με του t(o.ot) απλά με πιο όμορφο τρόπο
t(o.ot) Δημοσ. 13 Νοεμβρίου 2014 Δημοσ. 13 Νοεμβρίου 2014 Με τα nested ternaries και γενικότερα με όλο τον κώδικα που είναι "too smart for its own good". Παλιότερα ενθουσιαζόμουν με τρόπους να γραφτεί κάποιος σε λιγότερες γραμμές, σε ένα μόνο statement, κλπ κλπ. Τώρα ξέρω ότι το ζητούμενο από τον κώδικα είναι να γίνεται άμεσα κατανοητός στον αναγνώστη, όχι να τον βλέπεις και να χαίρεσαι "look ma no semicolons". PS: Η 5.3 κυκλοφόρησε πριν 5 χρόνια και έχει ήδη γίνει EOLed. Δεν υπάρχει περίπτωση να τρέχει οτιδήποτε λιγότερο. Ακόμα και το debian stable τρέχει 5.4. Κατάλαβα*, γενικά μιλώντας συμφωνώ, αλλά δεν θεωρώ ότι τα nested ternaries είναι too smart for its own good γενικά, καθώς γράφεις στο 1/4 των γραμμών κάτι που παραμένει readable (ισχύει αυτό; κάνε αυτό αλλιώς ισχύει αυτό; κάνε το άλλο κοκ). Απλά στην PHP για κάποιο λόγο δεν τους άρεσε αυτό και κάνανε του κεφαλιού τους. Οι σέρβερ της δουλειάς τρέχουν -κρατήσου- PHP 5.1. Οι SysAdmins δεν αναβαθμίζουν για "stability reasons". Θα σου πω απλά ότι το περίφημο shellshock bug το πατσάρανε μόλις την προηγούμενη εβδομάδα. Και για αυτή την αδράνεια ευθύνονται οι managers. *The practice of programming του Kerninghan?
defacer Δημοσ. 13 Νοεμβρίου 2014 Δημοσ. 13 Νοεμβρίου 2014 Κατάλαβα*, γενικά μιλώντας συμφωνώ, αλλά δεν θεωρώ ότι τα nested ternaries είναι too smart for its own good γενικά, καθώς γράφεις στο 1/4 των γραμμών κάτι που παραμένει readable (ισχύει αυτό; κάνε αυτό αλλιώς ισχύει αυτό; κάνε το άλλο κοκ). Απλά στην PHP για κάποιο λόγο δεν τους άρεσε αυτό και κάνανε του κεφαλιού τους. Eξακολουθώ να διαφωνώ. Πρώτον πρέπει να κάνεις parse αυτό που διαβάζεις, που ακόμα και για τους πιο βετεράνους δε μπορεί να είναι πιο εύκολο από το if/elseif (για τους με λιγότερο από 10 χρόνια εμπειρία εννοείται είναι πάντα πιο δύσκολο και απλώς συζητάμε το πόσο). Δεύτερον πρέπει να ξέρεις για το associativity του operator ?:. Μόνο και μόνο που είπα "operator associativity" έχω αφήσει απέξω το 99% του πληθυσμού του προγραμματιστών. Γενικά έτσι δημιουργείς ένα cognitive κόστος στον αναγνώστη. Αυτό το κόστος οδηγεί σε αυξημένη πιθανότητα bug, που είναι πολύ κακό ενδεχόμενο. Οπότε πρέπει να ρωτήσεις τον εαυτό σου τι αγοράζεις μ' αυτό το τίμημα; Λιγότερες πληκτρολογήσεις η/και λιγότερα newlines? Για μένα η αξία αυτού του πράγματος είναι τόσο χαμηλή που δε θα το αγόραζα εκτός κι αν ήταν τζάμπα. Αλλά δεν είναι τζάμπα. Κάθε φορά που το διαβάζεις θα πληρώνεις λίγο σε κούραση και κάθε φορά που πας να το πειράξεις θα πληρώνεις λίγο σε ρίσκο. Νομίζω πως θα συμφωνήσεις ότι αυτό είναι πολύ πιο ευκολοδιάβαστο: if (substr($word, -3) === "n't") $_word = substr($word, 0, -3); else if (substr($word, -3) === "'ll") $_word = substr($word, 0, -3); else if (substr($word, -2) === "'s")? $_word = substr($word, 0, -2); Οι σέρβερ της δουλειάς τρέχουν -κρατήσου- PHP 5.1. Οι SysAdmins δεν αναβαθμίζουν για "stability reasons". Θα σου πω απλά ότι το περίφημο shellshock bug το πατσάρανε μόλις την προηγούμενη εβδομάδα. Και για αυτή την αδράνεια ευθύνονται οι managers. Ας πούμε απλά ότι το γεγονός πως σε κάποια συγκεκριμένη περίπτωση συμβαίνει αυτό δε μπορεί να μας οδηγήσει σε γενικότερο συμπέρασμα. *The practice of programming του Kerninghan? Δεν ξέρω να σου πω την αλήθεια. Είναι από αυτά τα πράγματα που τα συναντάς πολλές φορές και στο τέλος ξεχνάς πού τα πρωτοείδες. Ταυτόχρονα όμως κι από αυτά τα πράγματα με τα οποία γενικά θα συμφωνήσεις από την πρώτη στιγμή, αλλά θα κάνεις αρκετό καιρό να σκεφτείς "ΤΩΡΑ καταλαβαίνω πραγματικά". 1
t(o.ot) Δημοσ. 14 Νοεμβρίου 2014 Δημοσ. 14 Νοεμβρίου 2014 Eξακολουθώ να διαφωνώ. Πρώτον πρέπει να κάνεις parse αυτό που διαβάζεις, που ακόμα και για τους πιο βετεράνους δε μπορεί να είναι πιο εύκολο από το if/elseif (για τους με λιγότερο από 10 χρόνια εμπειρία εννοείται είναι πάντα πιο δύσκολο και απλώς συζητάμε το πόσο). Δεύτερον πρέπει να ξέρεις για το associativity του operator ?:. Μόνο και μόνο που είπα "operator associativity" έχω αφήσει απέξω το 99% του πληθυσμού του προγραμματιστών. Γενικά έτσι δημιουργείς ένα cognitive κόστος στον αναγνώστη. Αυτό το κόστος οδηγεί σε αυξημένη πιθανότητα bug, που είναι πολύ κακό ενδεχόμενο. Οπότε πρέπει να ρωτήσεις τον εαυτό σου τι αγοράζεις μ' αυτό το τίμημα; Λιγότερες πληκτρολογήσεις η/και λιγότερα newlines? Για μένα η αξία αυτού του πράγματος είναι τόσο χαμηλή που δε θα το αγόραζα εκτός κι αν ήταν τζάμπα. Αλλά δεν είναι τζάμπα. Κάθε φορά που το διαβάζεις θα πληρώνεις λίγο σε κούραση και κάθε φορά που πας να το πειράξεις θα πληρώνεις λίγο σε ρίσκο. Νομίζω πως θα συμφωνήσεις ότι αυτό είναι πολύ πιο ευκολοδιάβαστο: if (substr($word, -3) === "n't") $_word = substr($word, 0, -3); else if (substr($word, -3) === "'ll") $_word = substr($word, 0, -3); else if (substr($word, -2) === "'s")? $_word = substr($word, 0, -2); Ίδια μου φαίνονται, οπότε agree to disagree, κανένα πρόβλημα. =) Ας πούμε απλά ότι το γεγονός πως σε κάποια συγκεκριμένη περίπτωση συμβαίνει αυτό δε μπορεί να μας οδηγήσει σε γενικότερο συμπέρασμα. Σε καμία περίπτωση δε λέω ότι είναι ο κανόνας, απλά συμβαίνει πολλές φορές να είσαι υπχρεωμένος να παίζεις με outdated software. Η παρατήρησή μου στον ραφίνο είχε σκοπό την επισήμανση πως τα closures υποστηρίζονται από την 5.3 και μετά χάριν πληρότητας. Τίποτα περισσότερο. Anyway, πραγματικά πολύ ωραία κουβέντα αλλά έχουμε ξεφύγει από το θέμα αρκετά. Κλείνω εδώ το offtopic από μεριάς μου. 1
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα