0
votes

Une fonction PHP qui ajoute # hashtag à un tableau de mots

J'essaie d'écrire une fonction qui ajoute le signe # à un tableau de mots dans une chaîne

Étant donné que je peux utiliser le str_replace pour chacun d'eux, mais mon tableau s'agrandit et ce n'est pas efficace.

/ p>

$needles = array('a', 'c', 'd');
$haystack = 'a b c d e f g';
    foreach($needles as $what) {
        if(strpos($haystack, $what)!==false) {
     $haystack = str_replace($needles, '#'.$what.'-', $haystack);
    }
    }
echo $haystack;

Le tableau ici est des aiguilles acd dans une botte de foin de abcdefg J'essaye de les rendre #a #b #c pour que le résultat soit #a b #c #d e f g


1 commentaires

Quelle est la taille de votre tableau?


3 Réponses :


0
votes

Je ne sais pas si c'est plus rapide que vous deviez le comparer, mais cette solution fonctionne. Regex est lent, mais itérer une fois dans une chaîne devrait être plus rapide que la parcourir N fois.

#a b #c #d e f g

Sortie

<?php
$needles = array('a', 'c', 'd');
$haystack = 'a b c d e f g';
$reg = '~(['.implode($needles).'])~';

echo preg_replace ( $reg, '#$1' , $haystack );


0 commentaires

1
votes

Vous utilisez mal cette fonction str_replace () Pour en savoir plus sur cette fonction, cliquez ici fonction str_replace

#a b #c #d e f g

Sortie

$needles = array('a', 'c', 'd');
$haystack = 'a b c d e f g';

    foreach($needles as $key) {
        if(strpos($haystack, $key)!==false) {
     $haystack = str_replace($key, '#'.$key, $haystack);
    }
    }
echo $haystack;

J'espère que cela vous aidera


0 commentaires

0
votes

Comment peut-il être optimisé:

  1. Instructions de quantité limite à exécuter pour chaque aiguille
  2. Utilisez des instructions plus rapides
  3. Modifier l'approche du chemin d'exécution afin que toute l'application utilise la solution de manière plus efficace

donc ça va:

  1. strpos ($ haystack, $ what) - cette fonction peut être supprimée
  2. str_replace () peut être remplacé par in_array () qui devrait être plus rapide.
  3. Dans votre exemple de code, str_replace () doit rechercher une lettre pour changer la longueur totale de la botte de foin multipliée par le nombre d'aiguilles, donc si la botte de foin est de 10 caractères et que vous avez 5 aiguilles, cela signifie que str_replace recherche sur un total de 500 caractères ( Recherche 5 fois dans une chaîne de 100 caractères). S'il n'y a pas 5 mais 10 aiguilles et que la botte de foin est de 1000 caractères, alors la longueur saute jusqu'à 10k de longueur en caractères totaux pour que str_replace soit traitée. C'est pourquoi vous constatez un ralentissement dramatique de l'exécution lorsque vous augmentez le nombre d'aiguilles ou / et la longueur de la botte de foin. Idéalement, la recherche doit être effectuée une fois pour toute la longueur de la botte de foin, donc s'il y a 5 aiguilles et que la botte de foin est de 100 caractères, la recherche ne doit être effectuée qu'une seule fois et au total des caractères de 100 caractères que la recherche doit examiner. De plus: pour les longues chaînes stockées dans des fichiers, vous pouvez ignorer le chargement en mémoire du tout en utilisant des flux et les lire un par un directement à partir du fichier et les remplacer à la volée.

code:

    $convertedStr = '';
    foreach($converted as $convertedChar) {
        $convertedStr .= $convertedChar;
    }

    //and echo or save later
    echo $convertedStr;

donne :

//echo converted string char by char
foreach($converted as $convertedChar) {
    echo $convertedChar;
}

comment utiliser:

mettez la définition de function convert () {} où vous voulez et utilisez-la plus tard:

# or use when haystack is in file
$filePath = 'test-file.txt';
$fileResource = fopen($filePath, 'r');
$converted = convert($needles, $fileResource);

$ converti est maintenant une sorte de tableau dont chaque élément est un caractère de la chaîne qui est convertie. Donc, pour faire écho à tous les caractères, vous le traitez comme un tableau

['#a', 'b', '#c', '#d', 'e', ​​'f', 'g']

et écho à l'intérieur de la boucle foreach:

//$converted = convert($needles, $haystack);

la bonne chose est que le "genre de tableau" n'est jamais créé il ne ressemble et se sent comme un tableau pour foreach mais en fait il ne retourne qu'un seul caractère modifié pour chaque itération. Par conséquent, une consommation de mémoire de convert () n'est presque rien.

la deuxième approche (ad 3.) est de lire toute la meule de foin à partir d'un fichier et de la traiter à la volée. Cette approche peut gérer même une très grande botte de foin car elle ne la lit pas dans la mémoire à la fois et la stocke en entier avant le traitement, mais lit un caractère à partir de l'entrée, puis le change et fait écho, et un autre. bloc de code:

//echo converted string char by char
foreach($converted as $convertedChar) {
    echo $convertedChar;
}

et décommentez ceci:

$needles = array('a', 'c', 'd');
$haystack = 'a b c d e f g';

$converted = convert($needles, $haystack);

puis faites un écho comme avant avec foreach

#a b #c #d e f g

si vous voulez stocker le texte converti en chaîne, vous pouvez le faire comme ça:

<?php

$needles = array('a', 'c', 'd');
$haystack = 'a b c d e f g';

function convert($needles, $haystack) {

    if(is_resource($haystack)) {
        $stream = $haystack;
    } else {
        $stream = fopen('data://text/plain,' . $haystack,'r');
    }

    while($char = fgetc($stream)) {
        if(in_array($char, $needles)) {
            $result = '#' . $char;
        } else {
            $result = $char;
        }

        yield $result;
    }

    if(is_resource($stream)) {
        fclose($stream);
    }
}

# use with haystack as string
$converted = convert($needles, $haystack);

# or use when haystack is in file
// $filePath = 'test-file.txt';
// $fileResource = fopen($filePath, 'r');
// $converted = convert($needles, $fileResource);

//echo converted string char by char
foreach($converted as $convertedChar) {
    echo $convertedChar;
}


0 commentaires