2013-10-01 14 views
3

Je dois obtenir chaque premier mot des lignes dans mon $lines. Donc, je fais un foreach sur chaque ligne comme celui-ci:Obtenez le premier mot de chaque ligne

foreach ($lines as $n => $line) { 

} 

Mais la prochaine partie, je dois saisir seul le premier mot. Alors je l'ai fait avec l'explosion sur un espace comme celui-ci:

$explode = explode(" ", $line); 
echo $explode[0]; 

Mais cela est très lent quand je le fais avec beaucoup de lignes, est-il une solution meilleure et plus rapide puis en utilisant un explode()?

+0

que diriez-vous nous dire un exemple de cette $ line? – Reinherd

+0

Vous pouvez itérer sur chaque ligne jusqu'à ce que vous trouviez un espace. Ce sera ta parole. – Jonatan

+0

Vous devez accepter une réponse. – UFL1138

Répondre

6

Oui!

$var = substr($line, 0, strpos($line, ' '));

substr() garnitures une chaîne en utilisant la position de départ (0, le début) et longueur: http://php.net/manual/en/function.substr.php

Nous déterminons la longueur en utilisant strpos() pour trouver la première occurrence de l'expression de recherche (dans ce cas un espace): http://php.net/manual/en/function.strpos.php

+0

Comment est-ce plus rapide que d'utiliser 'explode'? – Neal

+3

C'est plus rapide car il s'arrête au premier espace au lieu de trouver chaque espace comme exploser(). – UFL1138

+0

Merci @SetSailMedia, ça marche et mon temps de chargement était bien meilleur! Acceptera votre réponse dans quelques minutes :) –

3

Utiliser strpos et substr. Obtenez l'index du premier espace avec strpos et utilisez ensuite cet index comme fin de votre sous-chaîne. Cela vous évitera d'exploser chaque ligne.

+1

+1, nous devons avoir obtenu ici en même temps:} –

0

Utilisez la chaîne fonction jeton http://www.w3schools.com/php/func_string_strtok.asp

+0

Comment est-ce mieux que d'exploser sur un espace? – abiessu

+2

juste pour équilibrer la référence que vous avez donnée: http: //www.w3fools.com – tborychowski

+0

@tborychowski huh, ne le savais pas. Trouvé le site via google et quelques exemples où utile pour moi dans le passé. –

0

Utilisez un regex. Cela devrait obtenir le match avant le premier espace. (?:^|(?:\.\s))(\w+)

+2

Je ne crois pas que ce sera plus rapide que d'exploser. Ou le sera-t-il? – UFL1138

+0

@ UFL1138 C'est plus rapide parce que les expressions régulières, si elles sont utilisées correctement, s'arrêtent dès qu'elles ont le premier match et ne fonctionnent pas sur toute la chaîne en comparaison pour exploser. – dudemanbearpig

+0

Il y a encore beaucoup de frais généraux pour instancier le moteur regex. En tout cas, il ne sera certainement pas plus rapide que d'utiliser strpos et substr. – UFL1138

0

Vous devriez essayer ceci:

list($firstWord) = explode(" ",trim($line)); 

voir here

0

Vous pouvez également utiliser explode avec la limite:

explode(" ", $line, 1); 

Bien que ce soit beaucoup plus rapide que explode sans limite, ce n'est pas aussi rapide que la solution substr() proposée par l'utilisateur: Set Sail Media.

Dans mes tests avec 100K lignes, chaque ligne ayant environ 10K mots:

explode  : 175s 
explode+limit : 0s 
substr()  : 0s 

Avec des lignes 1M, chaque ligne ayant autour de 20K mots:

explode  : too long :-) 
explode+limit : 12s 
substr()  : 0s 
+0

Que diriez-vous des lignes 1M chacune avec seulement environ 20 mots? – UFL1138

Questions connexes