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
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
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
str_replace est beaucoup plus rapide.
$find_letters = array('a', 'c', 'd');
$string = 'abcdefg';
$match = (str_replace($find_letters, '', $string) != $string);
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
.
cette expression recherche toutes les lettres:
count(array_filter(
array_map("strpos", array_fill(0, count($letters), $str), $letters),
"is_int")) == count($letters)
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.
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
.
Vous pouvez essayer ceci:
function in_array_strpos($word, $array){
foreach($array as $a){
if (strpos($word,$a) !== false) {
return true;
}
}
return false;
}
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));
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!';
}
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;
}
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.
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;
}