Rechercher partie de chaine dans un tableau

Kenichi27
Invité n'ayant pas de compte PHPfrance

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.

ViPHP
ViPHP | 5462 Messages

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
)
*/

kenichi27
Invité n'ayant pas de compte PHPfrance

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...

ViPHP
ViPHP | 5462 Messages

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
)
*/

kenichi27
Invité n'ayant pas de compte PHPfrance

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

ViPHP
ViPHP | 5462 Messages

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
)
*/

Kenichi27
Invité n'ayant pas de compte PHPfrance

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 !

ViPHP
ViPHP | 5462 Messages

16 nov. 2010, 12:15

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

ViPHP
ViPHP | 3607 Messages

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?

ViPHP
ViPHP | 5462 Messages

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

ViPHP
ViPHP | 3607 Messages

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 :)

ViPHP
ViPHP | 5462 Messages

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

ViPHP
ViPHP | 5462 Messages

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)