2017-10-19 3 views
2

Je souhaite supprimer des valeurs de moins de deux caractères d'un grand tableau contenant 9436065 valeurs de chaîne. J'EFFACÉS preg_grep() en utilisant ce code:Comment puis-je supprimer rapidement une valeur de moins de deux caractères d'un grand tableau?

function delLess($array, $less) 
{ 
    return preg_grep('~\A[^qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM]{'.$less.',}\z~u', $array); 
} 

$words = array("ӯ","ӯро","ӯт","ғариб","афтода","даст", "ра"); 

echo "<pre>"; 
print_r(delLess($words,2)); 
echo "</pre>"; 

Mais il fonctionne plus lentement. Est-il possible d'optimiser ce code?

+0

Vous pouvez utiliser 'isset ($ word [1]) 'mais cela ne fonctionnera pas de manière fiable pour les chaînes multi-octets, par exemple ça enlèverait "pa". D'où obtenez-vous le tableau en premier lieu? Pouvez-vous déjà le filtrer à la source? – Gordon

+0

Les réponses pourraient certainement aller mieux si nous avions plus d'informations sur l'utilisation et l'origine de ces chaînes. En nous limitant à ce que nous savons maintenant, je ne vois pas de raison de changer quoi que ce soit ... – Salketer

Répondre

-1

compte tenu de la taille de l'ensemble de données, j'utiliser une base de données, il serait probablement ressembler à ceci:

delete from table where length(field) <= 2 

peut-être quelque chose comme sqlite?

-1

Vous pouvez essayer d'utiliser la fonction strlen au lieu des expressions régulières et voir si cela est plus rapide. (Ou mb_strlen pour les caractères multi-octets.)

$newArr = array(); 
foreach($words as $val) 
    if(strlen($val) > 2) 
     $newArr[] = $val; 

echo "<pre>"; 
print_r($newArr); 
echo "</pre>"; 
+0

pourquoi était-ce downvoted? Je pense que c'est une réponse acceptable? Je ne comprends pas l'homme ... –

-1

Je pencherais pour array_filter fonction, la performance devrait être mieux.

function filter($var) 
{ 
    return strlen($var) > 2; 
} 

$newArray = array_filter($array, "filter")); 
+0

aussi acceptable, aussi downvoted, ressemble à des gens comme "ne pas aimer les choses" wtf man ... –

+0

ouais, aucune idée pourquoi j'ai eu une downvote:/ – jabko87

-1

Tout travail sur 10 millions de chaînes prendra du temps. À mon avis, ce genre d'opération est un one timer, donc ce n'est pas vraiment important si ce n'est pas instantané.

D'où viennent les cordes? Vous les avez certainement obtenus à partir d'une base de données, si c'est le cas, faites le travail sur la base de données, ce sera plus rapide et au moins vous ne serez jamais pollué avec eux. Ce type d'opération sera plus rapide sur une base de données que PHP, mais pourrait prendre du temps. Encore une fois, si elle est stockée dans une base de données, elle n'est pas arrivée magiquement ... Ainsi, vous pouvez également vous assurer qu'aucune nouvelle entrée indésirable ne s'y trouve, de cette façon vous vous assurez que cette opération n'aura pas besoin d'être refait. Je suis conscient que cela ne répond absolument pas du tout à votre question, car nous devrions nous en tenir à PHP et vous avez le meilleur moyen de le faire ... Optimiser une fonction aussi simple coûterait beaucoup de temps et ne serait pas J'apporte beaucoup d'optimisations ... La seule autre suggestion que je pourrais faire est d'utiliser un autre outil, sinon base de données, basé sur des fichiers comme sed, awk ou tout ce qui lit/écrit dans les fichiers ... Vous en auriez un chaîne par ligne et analyser le fichier en réduisant sa taille en conséquence, mais en écrivant le fichier à partir de PHP, exec le script et charger le fichier en PHP rendrait les choses trop compliquées pour rien ...

+0

Les mots sont tirés de la 'forme 'du côté de l'utilisateur ou d'un' fichier' externe (doc, docx) à ajouter à la base de données. Et cette fonction est nécessaire pour supprimer les mots indésirables de moins de 2 caractères. @Salketer – Otabek

+0

ok, merci pour la clarification. quand vous dites moins de 2 caractères, est-ce que ce sont des caractères? Parce que dans votre OP il ne semble pas si ... Aussi, les mots sont-ils stockés séparément ou ensemble dans un champ? – Salketer

+0

Ici, nous ne parlons que de mots composés de lettres. @Salketer – Otabek