web-dev-qa-db-fra.com

rechercher dans un tableau php une correspondance partielle de chaîne

J'ai un tableau et j'aimerais rechercher la chaîne 'green'. Donc, dans ce cas, il devrait renvoyer le $arr[2]

$arr = array(0 => 'blue', 1 => 'red', 2 => 'green string', 3 => 'red');

existe-t-il une fonction prédéfinie telle que in_array () qui effectue le travail plutôt que de le parcourir en boucle et de comparer chaque valeur?

10
vnncn

Vous pouvez utiliser la fonction array_search de php. Il est supporté dans PHP> = 4.0.5.

$array = array(0 => 'blue', 1 => 'red', 2 => 'green string', 3 => 'red');
$m_array = preg_grep('/^green\s.*/', $array);

$m_array contient des éléments correspondants du tableau.

3
smitrp

Pour un correspondance partielle vous pouvez itérer le tableau et utiliser une fonction de recherche de chaîne comme strpos () .

function array_search_partial($arr, $keyword) {
    foreach($arr as $index => $string) {
        if (strpos($string, $keyword) !== FALSE)
            return $index;
    }
}

Pour un correspondance exacte , utilisez in_array ()

in_array('green', $arr)
17
n a

Il y a plusieurs façons ...

$arr = array(0 => 'blue', 1 => 'red', 2 => 'green string', 3 => 'red');

Recherche le tableau avec une boucle:

$results = array();

foreach ($arr as $value) {

  if (strpos($value, 'green') !== false) { $results[] = $value; }

}

if( empty($results) ) { echo 'No matches found.'; }
else { echo "'green' was found in: " . implode('; ', $results); }

Utilise array_filter ():

$results = array_filter($arr, function($value) {
    return strpos($value, 'green') !== false;
});

Pour utiliser les fermetures avec d'autres arguments, il existe le mot clé use-. Vous pouvez donc le résumer et l’envelopper dans une fonction:

function find_string_in_array ($arr, $string) {

    return array_filter($arr, function($value) use ($string) {
        return strpos($value, $string) !== false;
    });

}

$results = find_string_in_array ($arr, 'green');

if( empty($results) ) { echo 'No matches found.'; }
else { echo "'green' was found in: " . implode('; ', $results); }

Voici un exemple de travail: http://codepad.viper-7.com/xZtnN7

5
Quasdunk

pour rechercher avec comme as sql avec '% needle%', vous pouvez essayer avec

$input = preg_quote('gree', '~'); // don't forget to quote input string!
$data = array(
    1 => 'orange',
    2 => 'green string',
    3 => 'green', 
    4 => 'red', 
    5 => 'black'
    );
$result = preg_filter('~' . $input . '~', null, $data);

et le résultat est

{
  "2": " string",
  "3": ""
}
2
Kotzilla

PHP 5.3+

array_walk($arr, function($item, $key) {
    if(strpos($item, 'green') !== false) {
        echo 'Found in: ' . $item . ', with key: ' . $key;
    }
});
1
MrCode
<?php
   $a=array("a"=>"red","b"=>"green","c"=>"blue");
   echo array_search("red",$a);
?>

J'ai le même problème alors essayez ceci ...

1
dev_dodiya
function check($string) 
{
    foreach($arr as $a) {
        if(strpos($a,$string) !== false) {
            return true;
        } 
    }
    return false;
}
1
Louis.CLast

C'est une fonction pour les tableaux normaux ou multidimensionnels. 

  • Affaire non sensible
  • Fonctionne pour les tableaux normaux et multidimentionnels
  • Fonctionne pour trouver des piqûres complètes ou partielles

Voici le code (version 1)

function array_find($needle, array $haystack, $column = null) {

    if(is_array($haystack[0]) === true) { // check for multidimentional array

        foreach (array_column($haystack, $column) as $key => $value) {
            if (strpos(strtolower($value), strtolower($needle)) !== false) {
                return $key;
            }
        }

    } else {
        foreach ($haystack as $key => $value) { // for normal array
            if (strpos(strtolower($value), strtolower($needle)) !== false) {
                return $key;
            }
        }
    }
    return false;
} 

Voici un exemple:

$multiArray = array(
     0 => array(
              'name' => 'kevin',
              'hobbies' => 'Football / Cricket'),
      1 => array(
              'name' => 'tom',
              'hobbies' => 'tennis'),
       2 => array(
              'name' => 'alex',
              'hobbies' => 'Golf, Softball')
);
$singleArray = array(
        0 => 'Tennis',
        1 => 'Cricket',
);

echo "key is - ". array_find('cricket', $singleArray); // returns - key is - 1
echo "key is - ". array_find('cricket', $multiArray, 'hobbies'); // returns - key is - 0 

Pour les tableaux multidimensionnels uniquement - $ column correspond au nom de la clé dans chaque tableau. Si l'aiguille $ apparaît plusieurs fois, je suggère d'ajouter ce paramètre pour ajouter chaque clé à un tableau. 

Voici un exemple si vous attendez plusieurs correspondances (version 2) :

function array_find($needle, array $haystack, $column = null) {

    $keyArray = array();

    if(is_array($haystack[0]) === true) { // for multidimentional array

        foreach (array_column($haystack, $column) as $key => $value) {
            if (strpos(strtolower($value), strtolower($needle)) !== false) {
                $keyArray[] = $key;

            }
        }

    } else {
        foreach ($haystack as $key => $value) { // for normal array
            if (strpos(strtolower($value), strtolower($needle)) !== false) {
                $keyArray[] = $key;
            }
        }
    }

    if(empty($keyArray)) {
        return false;
    }
    if(count($keyArray) == 1) {
        return $keyArray[0];
    } else {
        return $keyArray;
    }

}

Ceci retourne la clé s'il n'y a qu'une seule correspondance, mais s'il y a plusieurs correspondances pour l'aiguille $ dans l'une des colonnes de la colonne $, alors elle retournera un tableau des clés correspondantes.

J'espère que cela t'aides :)

0
Oli Girling

Une recherche rapide d'une phrase dans tout le tableau pourrait ressembler à ceci:

if (preg_match("/search/is", var_export($arr, true))) {
    // match
}
0
phoenix

Afin de savoir si la sous-chaîne UTF-8 respectant la casse est présente dans array, j'ai trouvé que cette méthode serait beaucoup plus rapide que d'utiliser mb_strtolower ou mb_convert_case:

  1. Implode le tableau dans une chaîne: $ imploded = implode ("", $ myarray); .

  2. Convertissez une chaîne implodée en minuscule à l'aide d'une fonction personnalisée: $ lowercased_imploded = to_lower_case ($ imploded);

    fonction to_lower_case ($ str) {

$ from_array = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L "," M "," N "," O "," P "," Q "," R "," S "," T "," U "," V "," W "," W "," X ", "Y", "Z", "Ä", "Ö", "Ü", "", "Ž", "Š"];

$ to_array = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l "," m "," n "," o "," p "," q "," r "," s "," t "," u "," v "," w "," x ", "y", "z", "ä", "ö", "ü", "", "ž", "š"];

foreach ($ from_array comme $ key => $ val) {$ str = str_replace ($ val, $ to_array [$ key], $ str);}

return $ str;

}

  1. Recherche de correspondance à l'aide de strpos ordinaires: if (strpos ($ lowercased_imploded, "substring_to_find")! == false) {faire quelque chose}
0
Andrei Kravtsov
function findStr($arr, $str) 
{  
    foreach ($arr as &$s) 
    {
       if(strpos($s, $str) !== false)
           return $s;
    }

    return "";
}

Vous pouvez remplacer la valeur renvoyée par le numéro d’index correspondant avec un peu de modification si vous le souhaitez, mais comme vous avez dit "... renvoyez le $ arr [2]", je l’ai écrit pour renvoyer la valeur.

0
hirre