Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ. (επεξεργασμένο)
$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.

Επεξ/σία από t(o.ot)
Δημοσ.

Μπορείς να μου εξηγήσεις αυτό;

  $_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κ κατάλαβα τι κάνει :)

 

Θα δοκιμάσω και θα σου πω!

Δημοσ.

Οκ δουλεύει!

Από ότι κατάλαβα γαι να φτιάξεις κάτι τέτοιο και να δουλέψει τέλεια (αν γίνεται) πρέπει να έχεις μια μηχανή και να μαθαίνει λέξεις :P

 

Πάντως αυτό που είπες με λέξεις όπως το "ca" πιθανότατα να λυθεί καθώς έχω σκοπό να μην αφήνω τις λέξεις που έχουν length μικρότερο του 4 να περνάνε στον πίνακα. Το θέμα είναι ότι δεν ορίζω εγώ τι θα πρέπει να γίνει και τι όχι... και δυστυχώς τα μαθαίνω ένα ένα και εγώ (ότι χειρότερο δηλαδή) για αυτό όσο πάει αλλάζω και τα λεγόμενα μου και σας τα κάνω χειρότερα.

 

Ευχαριστώ πολύ :)

(ε λογικά αύριο μεθαύριο θα σας πρίξω πάλι :P)

Δημοσ.

Οκ, έχε απλά υπ' όψιν πως αυτή η λύση είναι τραγική όσον αφορά στην ταχύτητα, ειδικά αν πρόκειται να εκτελείς τον κώδικα πολύ συχνά ή/και αν μεγαλώσουν τα arrays πολύ (πχ αν ρίξεις λογοτεχνικό βιβλίο ή ρίξεις μερικές χιλιάδες λέξεις σαν stopwatches).

 

Μπορείς πάντα να αντιστρέψεις κλειδιά και τιμές στο stopwatches array και να αντικαταστήσεις την in_array με isset.

Δημοσ.

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);

 

  • Like 2
Δημοσ.

 

Καλή φάση που κατάλαβες, αλλά ποτέ μη κάνεις τέτοιο πράγμα στην πράξη. Αυτά είναι καγκουριές. Χίλιες φορές καλύτερα το if/elseif. Ακόμα και reverse switch θα ήταν προτιμότερο.

 

Elaborate please. Έχει να κάνει με την PHP μόνο το σχόλιό σου ή γενικά με τα nested ternaries;

 

 

Κατά τ' άλλα, η λύση με το closure είναι η καλύτερη λύση ως τώρα, αρκεί να τρέχεις σε PHP 5.3 και πάνω.

Δημοσ.

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.

Δημοσ.

 

Καλή φάση που κατάλαβες, αλλά ποτέ μη κάνεις τέτοιο πράγμα στην πράξη. Αυτά είναι καγκουριές. Χίλιες φορές καλύτερα το 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);

 

 

Όπως κάθε φορά έτσι και αυτή ευχαριστώ! :)

Επίσης φυσικά και δουλεύει ολόσωστα! :P

 

*Δίνει το ίδιο αποτέλεσμα με του t(o.ot) απλά με πιο όμορφο τρόπο :D

Δημοσ.

Με τα 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? :P

Δημοσ.

Κατάλαβα*, γενικά μιλώντας συμφωνώ, αλλά δεν θεωρώ ότι τα 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? :P

Δεν ξέρω να σου πω την αλήθεια. Είναι από αυτά τα πράγματα που τα συναντάς πολλές φορές και στο τέλος ξεχνάς πού τα πρωτοείδες. Ταυτόχρονα όμως κι από αυτά τα πράγματα με τα οποία γενικά θα συμφωνήσεις από την πρώτη στιγμή, αλλά θα κάνεις αρκετό καιρό να σκεφτείς "ΤΩΡΑ καταλαβαίνω πραγματικά".

  • Like 1
Δημοσ.

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 από μεριάς μου.

  • Like 1

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...