2010-04-21 5 views
0

Existe-t-il une meilleure méthode que la boucle avec strpos()?existe-t-il une fonction php native pour voir si un tableau de valeurs est dans un autre tableau?

Non, je cherche des correspondances partielles et pas une méthode de type in_array().

exemple aiguille et botte de foin et retour désiré:

$needles[0] = 'naan bread'; 
$needles[1] = 'cheesestrings'; 
$needles[2] = 'risotto'; 
$needles[3] = 'cake'; 

$haystack[0] = 'bread'; 
$haystack[1] = 'wine'; 
$haystack[2] = 'soup'; 
$haystack[3] = 'cheese'; 

//desired output - but what's the best method of getting this array? 
$matches[0] = 'bread'; 
$matches[1] = 'cheese'; 

-à-dire:

magic_function (botte de foin $,% aiguilles de $%)!

+0

[array_intersect] (http://www.php.net/manual/fr/function.array-intersect.php) – hsz

+0

Non, ne compare pas pain contre pain naan. L'OP semble chercher une fonction de correspondance générique. –

+0

cela fonctionnera-t-il pour des correspondances non exactes? – Haroldo

Répondre

2

Je pense que vous confondez $haystack et $needle dans votre question, parce que pain naan est pas botte de foin, ni cheesestring. Votre résultat souhaité suggère que vous recherchez fromage dans cheesestring à la place. Pour cela, ce qui suit fonctionnerait:

function in_array_multi($haystack, $needles) 
{ 
    $matches = array(); 
    $haystack = implode('|', $haystack); 
    foreach($needles as $needle) { 
     if(strpos($haystack, $needle) !== FALSE) { 
      $matches[] = $needle; 
     } 
    } 
    return $matches; 
} 

Pour votre botte de foin donné et aiguilles Effectue deux fois plus vite une solution de regex. Pourrait changer pour un nombre différent de paramètres cependant.

3
foreach($haystack as $pattern) { 
    if (preg_grep('/'.$pattern.'/', $needles)) { 
     $matches[] = $pattern; 
    } 
} 
+1

Court et doux. –

+0

function magic_function ($ haystack, $ aiguilles) { // code ci-dessus :) } – hsz

+0

retourne un tableau avec quatre éléments: pain, fromage, pain, fromage – Gordon

1

Je pense que vous devrez rouler les vôtres. Les commentaires fournis par l'utilisateur à array_intersect() fournissent un certain nombre d'implémentations alternatives (telles que this one). Vous devrez juste remplacer le == correspondant à strstr().

1
$data[0] = 'naan bread'; 
$data[1] = 'cheesestrings'; 
$data[2] = 'risotto'; 
$data[3] = 'cake'; 

$search[0] = 'bread'; 
$search[1] = 'wine'; 
$search[2] = 'soup'; 
$search[3] = 'cheese'; 

preg_match_all(
    '~' . implode('|', $search) . '~', 
    implode("\x00", $data), 
    $matches 
); 

print_r($matches[0]); 

// [0] => bread 
// [1] => cheese 

Vous obtiendrez de meilleures réponses si vous nous en dire plus sur le vrai problème .

Questions connexes