Question

Je suis en train de travailler une fonction php pour rechercher la page de référence pour les termes et exécuter une fonction basée sur l'existence de ces termes.

Création du code de base n'a pas été un problème, mais avec un assez grand nombre de mots et d'actions en option, le script devient assez long en utilisant des lignes individuelles pour chaque groupe de mots / fonction. Le concept de code de base est ci-dessous. Les fonctions strpos sont dans l'ordre inverse de préférence, de sorte que si deux ou plusieurs termes apparaissent, alors les plus importants sont les dernières et seront plus monter les précédents

(j'imagine qu'il peut-être un moyen de sortir du script après la première condition est remplie, mais mes expériences avec la sortie a échoué, donc je viens d'utiliser le séquençage inverse) .

group1 = array("word1","word2","word3","word4","word5");
group2 = array("word6","word7","word8");
group3 ... etc

foreach($group1 as $groupa) { if(stripos($string, $groupa) !== false) { do something A; }  }
foreach($group2 as $groupb) { if(stripos($string, $groupb) !== false) { do something B; }  }
foreach ... etc

Y at-il un moyen d'utiliser un tableau à deux dimensions ou deux tableaux, l'un avec des mots et une avec l'action? à-dire:

words = array("word1","word2","word3","word4","word5","word6","word7","word8")
actions = array("something A","something A","something A","something A","something A","something B","something B","something B")

foreach($words as $word) { if(stripos($string, $word) !== false) { do actions; }  }

...... ...... MIS À JOUR

Inspiré par la suggestion Phillips, nous avons fini avec un tableau multidimensionnel, puis à travers ses « franchi les lignes ». Il travaille maintenant sur l'extraction du tableau de MySQL plutôt que de l'écrire dans le code.

$terms = array( 
array( "word" => "word1", 
      "cat" => "dstn",
      "value" => "XXXX" 
    ),
    ..etc
    ..etc
);
foreach ($terms as $i => $row)  
{ if(stripos($refstring3, $row['word']) !== false) { $$row['cat'] = $row['value']; }  }

...... ...... MIS À JOUR

Il a évolué à une simple requête MySQL, suivi d'un while plutôt qu'un foreach. Fonctionne comme un charme, grâce aux commentaires et divers autres postes sur Stackoverflow.

Merci à tous.

Cet endroit est idéal pour l'apprentissage et la compréhension, les messages directement à la sauter la viande des choses et sauter avoir à chercher dans de nombreux tutoriels connexes mais inapplicables.

Était-ce utile?

La solution

Vous pouvez stocker vos mots-actions comme un tableau de valeur clé sous forme de

$actionsForWord = array("myAction" => "myword", "myAction2" => "myword2");

aller ensuite à travers ceux-ci et d'utiliser Eval et concaténation de chaîne pour appeler la fonction: http: / /php.net/manual/en/function.eval.php

Cependant, si vous nous en dire plus sur ce que vous voulez vraiment atteindre - à savoir quels sont quelques exemples d'actions que vous voulez prendre, en fonction de quels mots? - il peut y avoir beaucoup mieux et les moyens de plus propres pour organiser votre code. Et gardez à l'esprit que Eval doit être garanti par ne jamais la transmettre le contenu de l'utilisateur, de sorte que le travail avec votre « liste blanche » des commandes.

Autres conseils

Bien que la réponse Philipp Lenssen a donné est certainement correct (et accepté) et travailler, je déteste vraiment l'idée d'utiliser eval pour exécuter une fonction. Vous pouvez essayer cette place;

<?php
function search( $content, $actions ) {
    foreach( $actions as $action => $terms ) {
        foreach( $terms as $term ) {
            if( stripos( $content, $term ) !== false ) {
                /* Match found, perform $action, and return. */
                return $action( strtolower( $term ) );
            }
        }
    }
    return false;
}

function foo( $term ) {
    return "foo(): Found the term '{$term}'.";
}

function bar( $term ) {
    return "bar(): Found the term '{$term}'.";
}


$tests = array(
    'This is text containing term 1' => "foo(): Found the term 'term 1'.",
    'term 2 is in this text' => "foo(): Found the term 'term 2'.",
    'Capitals work, TERM 3' => "bar(): Found the term 'term 3'.",
    'No correct term to be found here' => false
);

$actions = array(
    'foo' => array(
        'term 1',
        'term 2'
    ),
    'bar' => array(
        'term 3'
    )
);

foreach( $tests as $content => $expected ) {
    $result = search( $content, $actions );
    echo $result . ( $result === $expected ? ' (CORRECT)' : ' (FALSE)' ) . PHP_EOL;
}

Il n'y a vraiment pas besoin d'utiliser eval et je conseille vivement contre.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top