web-dev-qa-db-fra.com

Utiliser un tableau comme des aiguilles dans les strpos

Comment utilisez-vous la strpos pour un tableau d'aiguilles lors de la recherche d'une chaîne? 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 ça, ça ne marcherait pas, ce serait bien s'il y avait quelque chose comme ça

73
MacMac

@Dave un extrait mis à jour de http://www.php.net/manual/fr/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".

Update: 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
116
Binyamin

str_replace est considérablement plus rapide.

$find_letters = array('a', 'c', 'd');
$string = 'abcdefg';
$match = (str_replace($find_letters, '', $string) != $string);
18
Leon

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

PHP Code:

<?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
Dave

Vous pouvez parcourir le tableau et définir une valeur "flag" si strpos renvoie false.

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

Puis vérifiez la valeur de $flag.

6
Evan Mulawski

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

$string = 'abcdefg';
if (strtok($string, 'acd') === $string) {
    // not found
} else {
    // found
}
5
netcoder

Cette expression recherche toutes les lettres:

count(array_filter( 
    array_map("strpos", array_fill(0, count($letters), $str), $letters),
"is_int")) == count($letters)
4
mario

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

Pour savoir si UN contenu du tableau d'aiguilles existe dans la chaîne et si rapidement renvoie true ou false:

$string = 'abcdefg';

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

Si oui, merci de donner @Leon crédit pour cela.

Pour savoir si TOUTES LES valeurs du tableau d'aiguilles existe dans la chaîne, comme dans ce cas, les trois 'a', 'b' et 'c' DOIVENT être présents, comme vous le mentionnez par exemple"

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

Beaucoup de réponses ici sortent de ce contexte, mais je doute que l’intension de la question que vous avez marquée comme résolue. 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?

Ensuite, vous essayez quelques "not accepted answers" sur cette page.

2
Jonas Lundman

Ceci est mon approche. Itérez sur les caractères de la chaîne jusqu'à ce qu'une correspondance soit trouvée. Sur un plus grand nombre d'aiguilles, cela sera supérieur à la réponse acceptée car il n'est pas nécessaire de vérifier chaque aiguille pour déterminer si 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;
}

J'ai comparé cela à la réponse acceptée et avec un tableau de plus de 7 $needles c'était de façon spectaculaire plus rapide.

1
billynoah

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!';
}

Vous pouvez essayer ceci: 

function in_array_strpos($Word, $array){

foreach($array as $a){

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

return false;
}
1
Rajnesh Nadan

Répondre à @binyamin et @Timo .. (pas assez de points pour ajouter un commentaire ..) mais le résultat ne contient pas la position ..
Le code ci-dessous renverra la position réelle du premier élément correspondant à ce que strpos est censé faire. Ceci est utile si vous vous attendez à trouver exactement 1 correspondance. Si vous comptez trouver plusieurs correspondances, la position du premier trouvé peut ne pas avoir 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
CO4 Computing

Juste une mise à niveau de 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
Andy Nguyen

Avec le code suivant:

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

Puis vérifiez la valeur de $flag. S'il s'agit de true, toutes les lettres ont été trouvées. Sinon, c'est false.

0
hakre

J'écris une nouvelle réponse qui, espérons-le, aidera les personnes à la recherche de 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 séparée". et c'est la question que j'ai rencontrée pour le 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 comptage la plus élevée sera la ou les chaînes que vous recherchez, vous pouvez l'obtenir avec:

print_r(array_search(max($found), $found));
0
ConorReidd