Page 1 sur 1

Rechercher partie de chaine dans un tableau

Posté : 15 nov. 2010, 16:30
par Kenichi27
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.

Re: Rechercher partie de chaine dans un tableau

Posté : 15 nov. 2010, 16:35
par stealth35
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
)
*/

Re: Rechercher partie de chaine dans un tableau

Posté : 15 nov. 2010, 16:57
par kenichi27
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

Posté : 15 nov. 2010, 17:00
par stealth35
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

Posté : 16 nov. 2010, 11:21
par kenichi27
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

Posté : 16 nov. 2010, 11:30
par stealth35
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

Posté : 16 nov. 2010, 12:10
par Kenichi27
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

Posté : 16 nov. 2010, 12:15
par stealth35
tu comprends le :
$reg = '/_(?:' . implode('|', array_map('preg_quote', $tab2)) . ')\.txt$/';

Re: Rechercher partie de chaine dans un tableau

Posté : 16 nov. 2010, 12:17
par jojolapine
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

Posté : 16 nov. 2010, 12:27
par stealth35
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

Posté : 16 nov. 2010, 12:39
par jojolapine
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

Posté : 16 nov. 2010, 12:43
par stealth35
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

Posté : 17 nov. 2010, 18:26
par stealth35
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)