Utilisation d'une matrice comme aiguilles dans strpos

comment utiliser le strpos pour une rangée d'aiguilles lors de la recherche d'une chaîne de caractères? Par exemple:

$find_letters = array('a', 'c', 'd');
$string = 'abcdefg';

if(strpos($string, $find_letters) !== false)
{
    echo 'All the letters are found in the string!';
}

parce qu'en utilisant ceci, ça ne marcherait pas, ce serait bien s'il y avait quelque chose comme ça

68
demandé sur MacMac 2011-06-09 00:04:28

14 réponses

@Dave un extrait mis à jour de http://www.php.net/manual/en/function.strpos.php#107351

function strposa($haystack, $needles=array(), $offset=0) {
        $chr = array();
        foreach($needles as $needle) {
                $res = strpos($haystack, $needle, $offset);
                if ($res !== false) $chr[$needle] = $res;
        }
        if(empty($chr)) return false;
        return min($chr);
}

comment utiliser:

$string = 'Whis string contains word "cheese" and "tea".';
$array  = array('burger', 'melon', 'cheese', 'milk');

if (strposa($string, $array, 1)) {
    echo 'true';
} else {
    echo 'false';
}

retournera true , à cause de array "cheese" .

mise à jour: code amélioré avec arrêt lorsque la première des aiguilles est trouvée:

function strposa($haystack, $needle, $offset=0) {
    if(!is_array($needle)) $needle = array($needle);
    foreach($needle as $query) {
        if(strpos($haystack, $query, $offset) !== false) return true; // stop on first true result
    }
    return false;
}
$string = 'Whis string contains word "cheese" and "tea".';
$array  = array('burger', 'melon', 'cheese', 'milk');
var_dump(strposa($string, $array)); // will return true, since "cheese" has been found
110
répondu Binyamin 2013-09-19 13:22:50

le code ci-dessous montre non seulement comment le faire, mais aussi le met dans une fonction facile à utiliser allant de l'avant. Il a été écrit par "jesda". (Je l'ai trouvé en ligne)

code PHP:

<?php
/* strpos that takes an array of values to match against a string
 * note the stupid argument order (to match strpos)
 */
function strpos_arr($haystack, $needle) {
    if(!is_array($needle)) $needle = array($needle);
    foreach($needle as $what) {
        if(($pos = strpos($haystack, $what))!==false) return $pos;
    }
    return false;
}
?>

Utilisation:

$needle = array('something','nothing');
$haystack = "This is something";
echo strpos_arr($haystack, $needle); // Will echo True

$haystack = "This isn't anything";
echo strpos_arr($haystack, $needle); // Will echo False 
15
répondu Dave 2017-11-08 14:55:44

str_replace est beaucoup plus rapide.

$find_letters = array('a', 'c', 'd');
$string = 'abcdefg';
$match = (str_replace($find_letters, '', $string) != $string);
14
répondu Leon 2017-05-29 23:59:19

vous pouvez itérer à travers le tableau et définir une valeur" flag "si strpos retourne false .

$flag = false;
foreach ($find_letters as $letter)
{
    if (strpos($string, $letter) === false)
    {
        $flag = true;
    }
}

vérifier ensuite la valeur de $flag .

6
répondu Evan Mulawski 2011-06-08 20:07:43

si vous voulez juste vérifier si certains caractères sont réellement dans la chaîne ou non, utilisez strtok :

$string = 'abcdefg';
if (strtok($string, 'acd') === $string) {
    // not found
} else {
    // found
}
6
répondu netcoder 2011-06-08 20:18:44

cette expression recherche toutes les lettres:

count(array_filter( 
    array_map("strpos", array_fill(0, count($letters), $str), $letters),
"is_int")) == count($letters)
4
répondu mario 2011-06-08 20:16:30

la question, l'exemple fourni est-il juste un" exemple " ou exacte ce que vous cherchez? Il y a beaucoup de réponses mixtes ici, et je ne comprends pas la complexité de la réponse acceptée.

pour savoir si un contenu du réseau d'aiguilles existe dans la chaîne, et rapidement retour vrai ou faux:

$string = 'abcdefg';

if(str_replace(array('a', 'c', 'd'), '', $string) != $string){
    echo 'at least one of the needles where found';
};

Si oui, veuillez donner des @Leon crédit pour cela.

pour savoir si toutes les valeurs de la rangée d'aiguilles existe dans la chaîne, comme dans ce cas, les trois 'a', 'b' et 'c' doivent être présents, comme vous mentionnez comme votre" Par exemple "

"

echo ' toutes les lettres se trouvent dans la chaîne!

beaucoup de réponses ici est hors de cela contexte, mais je doute que l'intension de la question que vous avez marqué comme résolu. Par exemple: La réponse acceptée est une aiguille de

$array  = array('burger', 'melon', 'cheese', 'milk');

et si tous ces mots doivent être trouvés dans la chaîne?

puis vous essayez quelque "not accepted answers" sur cette page.

1
répondu Jonas Lundman 2017-09-19 06:49:53

avec le code suivant:

$flag = true;
foreach($find_letters as $letter)
    if(false===strpos($string, $letter)) {
        $flag = false; 
        break;
    }

vérifier ensuite la valeur de $flag . Si c'est true , toutes les lettres ont été trouvés. Sinon, c'est false .

0
répondu hakre 2011-06-08 20:46:04

Vous pouvez essayer ceci:

function in_array_strpos($word, $array){

foreach($array as $a){

    if (strpos($word,$a) !== false) {
        return true;
    }
}

return false;
}
0
répondu Rajnesh Nadan 2016-04-18 04:36:43

j'écris une nouvelle réponse qui, je l'espère, aidera quiconque cherche similaire à ce que je suis.

cela fonctionne dans le cas de "j'ai plusieurs aiguilles et j'essaie de les utiliser pour trouver une chaîne de caractère". et c'est la question que j'ai rencontrée pour la trouver.

    $i = 0;
    $found = array();
    while ($i < count($needle)) {
        $x = 0;
        while ($x < count($haystack)) {
            if (strpos($haystack[$x], $needle[$i]) !== false) {
                array_push($found, $haystack[$x]);
            }
            $x++;
        }
        $i++;
    }

    $found = array_count_values($found);

le tableau $found contiendra une liste de toutes les aiguilles correspondantes, l'élément du tableau avec la valeur de compte la plus élevée sera la chaîne(s) que vous recherchez, vous pouvez obtenir ceci avec:

print_r(array_search(max($found), $found));
0
répondu ConorReidd 2016-11-04 21:20:26

vous pouvez également essayer d'utiliser strpbrk () pour la négation (aucune des lettres n'a été trouvée):

$find_letters = array('a', 'c', 'd');
$string = 'abcdefg';

if(strpbrk($string, implode($find_letters)) === false)
{
    echo 'None of these letters are found in the string!';
}
0
répondu The One and Only ChemistryBlob 2017-01-06 17:41:38

réponse à @ binyamin et @Timo.. (pas assez de points pour ajouter un commentaire..) mais le résultat ne contient pas la position..

Le code ci-dessous renvoie la position réelle du premier élément, ce que strpos est censé faire. Ceci est utile si vous vous attendez à trouver exactement 1 match.. Si vous vous attendez à trouver plusieurs correspondances, alors la position du premier trouvé peut être dénuée de sens.

function strposa($haystack, $needle, $offset=0) {
    if(!is_array($needle)) $needle = array($needle);
    foreach($needle as $query) {
      $res=strpos($haystack, $query, $offset);
      if($res !== false) return $res; // stop on first true result
    }
    return false;
}
0
répondu CO4 Computing 2017-11-14 22:15:28

C'est mon approche. Itérer sur les caractères de la chaîne jusqu'à ce qu'une correspondance soit trouvée. Sur un plus grand nombre d'aiguilles, cette réponse sera meilleure que la réponse acceptée, car il n'est pas nécessaire de vérifier chaque aiguille pour déterminer qu'une correspondance a été trouvée.

function strpos_array($haystack, $needles = [], $offset = 0) {
    for ($i = $offset, $len = strlen($haystack); $i < $len; $i++){
        if (in_array($haystack[$i],$needles)) {
            return $i;
        }
    }
    return false;
}

c'est très simple et efficace. J'ai comparé cela à la réponse acceptée et avec un tableau de 7 $needles les deux fonctions étaient à peu près au même niveau. Moins de 7 la réponse acceptée a obtenu de meilleurs résultats le mien, mais plus de 7 c'était dramatiquement plus rapide.

0
répondu billynoah 2018-04-27 03:16:31

juste une mise à jour des réponses ci-dessus

function strsearch($findme, $source){
    if(is_array($findme)){
        if(str_replace($findme, '', $source) != $source){
            return true;
        }
    }else{
        if(strpos($source,$findme)){
            return true;
        }
    }
    return false;
}
0
répondu Andy Nguyen 2018-05-15 16:57:54