web-dev-qa-db-fra.com

Rechercher PHP élément de tableau contenant une chaîne

$example = array('An example','Another example','Last example');

Comment puis-je effectuer une recherche lâche du mot "Dernier" dans le tableau ci-dessus?

echo array_search('Last example',$example);

Le code ci-dessus ne fera écho à la clé de la valeur que si l'aiguille correspond exactement à tout le contenu de la valeur, ce que je ne veux pas. Je veux quelque chose comme ça:

echo array_search('Last',$example);

Et je veux que la clé de la valeur fasse écho si la valeur contient le mot "Last".

32
UserIsCorrupt

Pour rechercher des valeurs correspondant à vos critères de recherche, vous pouvez utiliser la fonction array_filter:

$example = array('An example','Another example','Last example');
$searchword = 'last';
$matches = array_filter($example, function($var) use ($searchword) { return preg_match("/\b$searchword\b/i", $var); });

Désormais, le tableau $matches ne contiendra que les éléments de votre tableau d'origine contenant Word last (insensible à la casse).

Si vous devez rechercher des clés correspondant aux critères, vous devez alors parcourir le tableau:

$example = array('An example','Another example','One Example','Last example');
$searchword = 'last';
$matches = array();
foreach($example as $k=>$v) {
    if(preg_match("/\b$searchword\b/i", $v)) {
        $matches[$k] = $v;
    }
}

Maintenant, le tableau $matches contient les paires clé-valeur du tableau d'origine où les valeurs contiennent (insensible à la casse) Word last .

45
Aleks G
function customSearch($keyword, $arrayToSearch){
    foreach($arrayToSearch as $key => $arrayItem){
        if( stristr( $arrayItem, $keyword ) ){
            return $key;
        }
    }
}
17
Wayne Whitty
$input= array('An example','Another example','Last example');
$needle = 'Last';
$ret = array_keys(array_filter($input, function($var) use ($needle){
    return strpos($var, $needle) !== false;
}));

Cela vous donnera toutes les clés dont la valeur contient l'aiguille.

7
xdazz

Il trouve la clé d'un élément avec la première correspondance:

echo key(preg_grep('/\b$searchword\b/i', $example));

Et si vous avez besoin de toutes les clés, utilisez foreach:

foreach (preg_grep('/\b$searchword\b/i', $example) as $key => $value) {
  echo $key;
}
2
aDaemon

Je n'aime pas les expressions rationnelles car, autant que je sache, elles sont toujours plus lentes qu'une fonction string normale Donc ma solution est:

function substr_in_array($needle, array $haystack) { foreach($haystack as $value) { if(strpos($value, $needle) !== FALSE) return TRUE; } return FALSE; }

0
Dario

Je cherchais également une solution au problème d'OP et je suis tombé par hasard sur cette question via Google. Cependant, aucune de ces réponses ne l’a fait pour moi, alors j’ai trouvé quelque chose de différent qui fonctionne bien.

$arr = array("YD-100 BLACK", "YD-100 GREEN", "YD-100 RED", "YJ-100 BLACK");
//split model number from color
$model = explode(" ",$arr[0])
//find all values that match the model number
$match_values = array_filter($arr, function($val,$key) use (&$model) { return stristr($val, $model[0]);}, ARRAY_FILTER_USE_BOTH);
//returns
//[0] => YD-100 BLACK
//[1] => YD-100 GREEN
//[2] => YD-100 RED

Cela fonctionnera uniquement avec PHP 5.6.0 et les versions ultérieures.

0
Josan Iracheta

La réponse donnée par Aleks G n'est pas assez précise.

$example = array('An example','Another example','One Example','Last example');
$searchword = 'last';
$matches = array();
foreach($example as $k=>$v) {
    if(preg_match("/\b$searchword\b/i", $v)) {
        $matches[$k] = $v;
    }
}

La ligne

if(preg_match("/\b$searchword\b/i", $v)) {

devrait être remplacé par ceux-ci

$match_result = preg_match("/\b$searchword\b/i", $v);
if( $match_result!== false && $match_result === 1 ) {

Ou plus simplement

if( preg_match("/\b$searchword\b/i", $v) === 1 ) {

En accord avec http://php.net/manual/en/function.preg-match.php

preg_match () renvoie 1 si le motif correspond au sujet donné, 0 s'il ne correspond pas ou FALSE si une erreur se produit 

0
user5379368