2011-01-04 5 views
4

Comment obtenir le mot le plus long d'une chaîne?Mot le plus long d'une chaîne

Par exemple.

$string = "Where did the big Elephant go?"; 

Pour revenir "Elephant"

+8

Qu'avez-vous essayé jusqu'à présent? Alors que quelqu'un peut vous donner la réponse, vous en apprendrez beaucoup plus si vous essayez d'abord quelques trucs. (Et vous aurez plus de chances d'obtenir une meilleure réponse si vous montrez que vous y avez réfléchi.) – JasCav

Répondre

12

boucle à travers les mots de la chaîne, en gardant une trace de mot le plus long jusqu'à présent:

<?php 
$string = "Where did the big Elephant go?"; 
$words = explode(' ', $string); 

$longestWordLength = 0; 
$longestWord = ''; 

foreach ($words as $word) { 
    if (strlen($word) > $longestWordLength) { 
     $longestWordLength = strlen($word); 
     $longestWord = $word; 
    } 
} 

echo $longestWord; 
// Outputs: "Elephant" 
?> 

Peut-être fait un peu plus efficace, mais vous obtenez le idée.

+3

Vous l'avez écrit en 15 secondes ?! – JakeParis

+4

@JMCCreative: Je suis plutôt génial. –

+0

heh vous avez écrit presque exactement ce que j'ai écrit ... mais plus vite haha. – dqhendricks

2

Qu'en est-ce - split sur les espaces, puis trier par la longueur de la chaîne, et de saisir la première:

<?php 

$string = "Where did the big Elephant go?"; 

$words = explode(' ', $string); 

usort($words, function($a, $b) { 
    return strlen($b) - strlen($a); 
}); 

$longest = $words[0]; 

echo $longest; 

Modifier Si vous voulez exclure la ponctuation, par exemple: « Où est allé le grand éléphant », vous pouvez utiliser preg_split:

$words = preg_split('/\b/', $string); 
+0

Semble inutilement complexe pour aucun gain de performance. –

+0

@Tomalak En effet, c'est un peu plus lent. Pourtant, c'est une solution alternative, peut-être même plus jolie. – lonesomeday

0

Voici une autre solution:

$array = explode(" ",$string); 
$result = ""; 
foreach($array as $candidate) 
{ 
if(strlen($candidate) > strlen($result)) 
$result = $candidate 
} 
return $result; 
9

Mise à jour: Voici une autre façon encore plus court (et celui-ci est certainement nouvelle;)):

function reduce($v, $p) { 
    return strlen($v) > strlen($p) ? $v : $p; 
} 

echo array_reduce(str_word_count($string, 1), 'reduce'); // prints Elephant 

similaires comme déjà affiché, mais en utilisant str_word_count pour extraire les mots (par juste fractionner aux espaces, les signes de ponctuation seront comptés aussi):

$string = "Where did the big Elephant go?"; 

$words = str_word_count($string, 1); 

function cmp($a, $b) { 
    return strlen($b) - strlen($a); 
} 

usort($words, 'cmp'); 

print_r(array_shift($words)); // prints Elephant 
+0

+1 pour l'utilisation de 'str_word_count()'. J'aurais placé la fonction immédiatement dans l'appel de 'usort()' pour la brièveté cependant. Je suis un esclave des conventions de jQuery! – Sampson

+0

@Jonathan Sampson: Mais alors je n'ai aucune référence au tableau ... –

+0

Je n'aime pas le besoin de créer une fonction (et de polluer la table des symboles)! 'create_function' corrigerait cela mais ensuite les choses sont très verbeuses. –

0

Ceci est une fonc tion lorsqu'ils traitent avec le texte de sorte qu'il pourrait être une bonne idée de créer une fonction PHP à cette fin:

function longestWord($txt) { 
    $words = preg_split('#[^a-z0-9áéíóúñç]#i', $txt, -1, PREG_SPLIT_NO_EMPTY); 
    usort($words, function($a, $b) { return strlen($b) - strlen($a); }); 
    return $words[0]; 
} 
echo longestWord("Where did the big Elephant go?"); 
// prints Elephant 

Test cette fonction ici: http://ideone.com/FsnkVW