2011-12-21 4 views
6

Ho una funzione che accetta una stringa (il pagliaio) e una serie di stringhe (gli aghi) e restituisce true se almeno un ago è una sottostringa del pagliaio. Non ci è voluto molto tempo o sforzo per scriverlo, ma mi chiedo se c'è una funzione PHP che già lo fa.Trova l'ago nel pagliaio, dove l'ago è una matrice di aghi

function strstr_array_needle($haystack, $arrayNeedles){ 
    foreach($arrayNeedles as $needle){ 
     if(strstr($haystack, $needle)) return true; 
    } 
    return false;  
} 
+3

cambiamento 'strstr ($ pagliaio, $ ago)' a 'strpos ($ pagliaio, $ ago) == false' ... –

risposta

9

solo un suggerimento ...

function array_strpos($haystack, $needles) 
{ 
    foreach($needles as $needle) 
     if(strpos($haystack, $needle) !== false) return true; 
    return false; 
} 
+0

Grazie per la tua risposta, qualche motivo particolare per usare strpos piuttosto che strstr? – Drahcir

+1

@RichardLivingston, ciao, beh, dovresti, perché strstr restituisce parte della stringa (anche questo comportamento è diverso con PHP5.3), mentre strpos restituisce la posizione (se trovato) o falso (se non trovato), quindi è possibilmente più veloce . Dai documenti 'Se vuoi solo determinare se un particolare ago si verifica all'interno del pagliaio, usa invece la più veloce e meno intensiva funzione di memoria strpos(). Saluti. –

1

penso che la funzione più vicina sarebbe array_walk_recursive(), ma che richiede un callback. Quindi usarlo sarebbe probabilmente più complicato di quello che hai già.

0

Non sono esattamente sicuro di quello che si vuole fare, ma penso che lo in_array() potrebbe aiutarti a fare ciò che stai cercando.

$needleArray = array(1, 2, 3); // the values we want to get from 
$outputArray = array(...); // the values to search for 

foreach ($outputArray as $value) { 
    if (in_array($value, $needleArray)) { 
     // do what you want to do...the $value exists in $needleArray 
    } 
} 
+1

'in_array' supporta solo i confronti di uguaglianza (' == 'e' === '). La funzione di Richard utilizza il confronto delle sottostringhe. – outis

0

Se si sta solo cercando di determinare quale aghi esiste nel pagliaio, suggerisco la funzione array_intersect.

documentazione dal sito PHP.net

<?php 
$array1 = array("a" => "green", "red", "blue"); 
$array2 = array("b" => "green", "yellow", "red"); 
$result = array_intersect($array1, $array2); 
print_r($result); 
?> 

The above example will output: 
Array 
(
    [a] => green 
    [0] => red 
) 

Fondamentalmente, questo si tradurrà in una matrice che mostra tutti i valori che compaiono in entrambi gli array. Nel tuo caso, il tuo codice restituisce true se viene trovato un ago. Il codice seguente lo farà usando la funzione array_intersect, anche se è più semplice di quella di Charles è discutibile.

if(sizeof(array_intersect($hackstack, $arrayNeedles)) > 0) 
    return true; 
else 
    return false; 

Anche in questo caso, io non sono sicuro di quello che il codice sta cercando di fare, altro che ritornare vero se esiste qualsiasi ago. Se riesci a fornire un contesto su ciò che vuoi ottenere, potrebbe esserci un modo migliore.

Spero che questo aiuti.

0

Non esiste una singola funzione che si comporta come strstr_array_needle (il nome è fuorviante, mi aspetto che restituisca una sottostringa di $haystack). Ci sono altre funzioni che potrebbero essere utilizzate al posto di un ciclo, ma non hanno benefici e richiedono più tempo. Per esempio:

# iterates over entire array, though stops checking once a match is found 
array_reduce($needles, 
    function($found, $needle) use ($haystack) { 
     return $found || (strpos($haystack, $needle) !== false); 
    }, 
    false); 

# iterates over entire array and checks each needle, even if one is already found 
(bool)array_filter($needles, 
    function($needle) use ($haystack) { 
     return strpos($haystack, $needle) !== false; 
    }); 
0

Ecco una funzione provato e funzionando:!

<?php 
function strpos_array($haystack, $needles, $offset = 0) { 
    if (is_array($needles)) { 
     foreach ($needles as $needle) { 
      $pos = strpos_array($haystack, $needle); 
      if ($pos !== false) { 
       return $pos; 
      } 
     } 
     return false; 
    } else { 
     return strpos($haystack, $needles, $offset); 
    } 
}