Rechercher partie de chaine dans un tableau

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Rechercher partie de chaine dans un tableau

Re: Rechercher partie de chaine dans un tableau

par stealth35 » 17 nov. 2010, 18:26

on peux utiliser preg_grep pour éviter de faire une boucle
$tab1 = array('toto_123457.txt','titi_123456.txt','tata_2457.txt','tata_2456.txt');
$tab2 = array('123456','2456');

$reg = '/_(?:' . implode('|', array_map('preg_quote', $tab2)) . ')\.txt$/';

$out = preg_grep($reg, $tab1);

print_r($out)

Re: Rechercher partie de chaine dans un tableau

par stealth35 » 16 nov. 2010, 12:43

D'après les dire du monsieur:
Comment rechercher une partie du nom du fichier dans le tableau ?
Je vois pas le problème à sélectionner toutes les entrées contenants les mots-clés recherchés :)
la partie c'est 123456 dans toto_123457.txt

Re: Rechercher partie de chaine dans un tableau

par jojolapine » 16 nov. 2010, 12:39

D'après les dire du monsieur:
Comment rechercher une partie du nom du fichier dans le tableau ?
Je vois pas le problème à sélectionner toutes les entrées contenants les mots-clés recherchés :)

Re: Rechercher partie de chaine dans un tableau

par stealth35 » 16 nov. 2010, 12:27

sauf que c'est pas bon, si tu cherches 12 ca marche alors que ca devrait pas
et pour les performances faut arrêté de croire que les regexp ca bouffent de la ressource, ca a évoluer depuis le temps

Re: Rechercher partie de chaine dans un tableau

par jojolapine » 16 nov. 2010, 12:17

arrêtez avec la regexpigite aigue!!!
Dans ce cas là strpos() suffit largement :)
<?php
$tab1 = array('toto_123457.txt','titi_123456.txt','tata_2457.txt','tata_2456.txt');
$tab2 = array('123456','2456');

$results = array();

// parcours des données
foreach($tab1 as $key => $val)
{
  // parcours des mots-clés
  foreach($tab2 as $search)
  {
    // stockage des résultats positifs
    if(strpos($val,$search)!==false)
    {
        $results[$key] = $val;
    }
  }
}

print_r($results);

/*
Array
(
    [1] => titi_123456.txt
    [3] => tata_2456.txt
)
*/
 
Il y a une boucle de plus, mais je pense malgré tout que c'est moins gourmand qu'une expression régulière...
Et c'est plus compréhensible... non?

Re: Rechercher partie de chaine dans un tableau

par stealth35 » 16 nov. 2010, 12:15

tu comprends le :
$reg = '/_(?:' . implode('|', array_map('preg_quote', $tab2)) . ')\.txt$/';

Re: Rechercher partie de chaine dans un tableau

par Kenichi27 » 16 nov. 2010, 12:10

tout est dans le regex (j'ai mis des valeur qui correspondent pas, pour mieux voir)
$tab1 = array('toto_123457.txt','titi_123456.txt','tata_2457.txt','tata_2456.txt');
$tab2 = array('123456','2456');

$reg = '/_(?:' . implode('|', array_map('preg_quote', $tab2)) . ')\.txt$/';

foreach($tab1 as $key => $val)
{
    if(!preg_match($reg, $val))
    {
        unset($tab1[$key]);
    }
}

print_r($tab1);

/*
Array
(
    [1] => titi_123456.txt
    [3] => tata_2456.txt
)
*/
C'est parfait, merci pour tout !

Re: Rechercher partie de chaine dans un tableau

par stealth35 » 16 nov. 2010, 11:30

tout est dans le regex (j'ai mis des valeur qui correspondent pas, pour mieux voir)
$tab1 = array('toto_123457.txt','titi_123456.txt','tata_2457.txt','tata_2456.txt');
$tab2 = array('123456','2456');

$reg = '/_(?:' . implode('|', array_map('preg_quote', $tab2)) . ')\.txt$/';

foreach($tab1 as $key => $val)
{
    if(!preg_match($reg, $val))
    {
        unset($tab1[$key]);
    }
}

print_r($tab1);

/*
Array
(
    [1] => titi_123456.txt
    [3] => tata_2456.txt
)
*/

Re: Rechercher partie de chaine dans un tableau

par kenichi27 » 16 nov. 2010, 11:21

comment tu créer ton array pour récupérer les fichiers ? parce que peu etre qu'a se moment la tu peux faire un glob, sinon le RegexpIterator reviens a faire :
$arr = array('machin', 'truc', 'bidule', 'machine');

foreach($arr as $key => $val)
{
    if(!preg_match('/mac/', $val))
    {
        unset($arr[$key]);
    }
}
print_r($arr);
/*
Array
(
    [0] => machin
    [3] => machine
)
*/

Salut et merci pour aide.
Je galère. En faite, je n'ai pas fait le script, pour le moment j'essai juste de voir si cette partie là (recherche d'une partie de chaine dans un tableau est faisable). Voici mon exemple de bout de code :
$tab1 = array("toto_123456.txt","titi_123456.txt","tata_2456.txt","tata_2456.txt");
$tab2 = array("123456","2456"); // C'est volontaire les valeurs, dans le script que je dois faire, je n'aurais qu'une partie du nom du fichier

// Vérifier que les valeurs de $tab2 soient présente dans $tab1 (une partie des valeurs).
// Si oui, extraire les valeurs de tab1
Et franchement je coince, ça à l'air tout con, j'ai beau lire le manuel sur les arrays, je n'arrive pas à faire cette moulinette. Je faire une pause, je dois avoir trop le nez dedans !
Merci pour ton aide et désolé !

à+ tard

Re: Rechercher partie de chaine dans un tableau

par stealth35 » 15 nov. 2010, 17:00

comment tu créer ton array pour récupérer les fichiers ? parce que peu etre qu'a se moment la tu peux faire un glob, sinon le RegexpIterator reviens a faire :
$arr = array('machin', 'truc', 'bidule', 'machine');

foreach($arr as $key => $val)
{
    if(!preg_match('/mac/', $val))
    {
        unset($arr[$key]);
    }
}
print_r($arr);
/*
Array
(
    [0] => machin
    [3] => machine
)
*/

Re: Rechercher partie de chaine dans un tableau

par kenichi27 » 15 nov. 2010, 16:57

tu peux faire ca avec RegexpIterator :wink:

EDIT : si tu veux un exemple
$arr = array('machin', 'truc', 'bidule', 'machine');
$filter = new RegexIterator(new ArrayIterator($arr), '/mac/');
print_r(iterator_to_array($filter));

/*
Array
(
    [0] => machin
    [3] => machine
)
*/
Merci, je m'attendais à cette réponse avec RegexIterator mais malheureusement notre serveur n'est pas encore à jour en ce qui concerne PHP et ça ne sera pas fait avant l'année prochaine. Une autre solution ? J'ai regardé du côté de preg_grep mais ça coince...

Re: Rechercher partie de chaine dans un tableau

par stealth35 » 15 nov. 2010, 16:35

tu peux faire ca avec RegexpIterator :wink:

EDIT : si tu veux un exemple
$arr = array('machin', 'truc', 'bidule', 'machine');
$filter = new RegexIterator(new ArrayIterator($arr), '/mac/');
print_r(iterator_to_array($filter));

/*
Array
(
    [0] => machin
    [3] => machine
)
*/

Rechercher partie de chaine dans un tableau

par Kenichi27 » 15 nov. 2010, 16:30

Bonjour,

Est-il possible de rechercher une partie de chaine dans un tableau en php ?
J'ai d'un côté une variable issue de l'extraction d'un nom de fichier et de l'autre un tableau contenant les noms des fichiers. Comment rechercher une partie du nom du fichier dans le tableau ?

Merci pour vos retours.