2011-06-08 8 views
3

tousPHP Retour résultat dans un groupe différent

J'ai un paquet de données comme 1, 2, 3, 4, 5, 6, 7, 8, 9, 10

alors je séparer ces données en 2 groupes qui est

$groupA = range(1, 5) 

$groupB = range(6, 10) 

Par exemple, je $data = array(1, 4) et il renverra ceci appartiennent au groupe A. De même, $data = array(7,8), il me rendra le groupe B.

Alors, comment puis-je écrire un script pour que $data = array(1, 4, 6, 7) me renvoie le groupe A et le groupe B?

Merci

Répondre

4

Vous pouvez utiliser array_intersect:

$groupA = range(1, 5); 
$groupB = range(6, 10); 
$data = array(1, 4, 6, 7); 
$foundGroups = array(); 
if(array_intersect($data, $groupA)) 
    $foundGroups[] = 'A'; 
if(array_intersect($data, $groupB)) 
    $foundGroups[] = 'B'; 
print_r($foundGroups); 

Notez que an empty array evaluates to false tout en un avec au moins un élément évalue à true. Attention: Si vous devez travailler avec beaucoup de groupes avec de nombreux éléments, vous pouvez utiliser une approche manuelle et arrêter au premier élément commun trouvé. array_intersect trouve tous les éléments communs et vous n'avez pas vraiment besoin de ça.

+1

solution propre. mais pas efficace pour les grandes baies. Il effectue une intersection complète même si la vérification de la première valeur indique que le sous-tableau appartient à un tableau plus grand. – DhruvPathak

+0

@DhruvPathak Vous avez raison. Une approche manuelle serait plus efficace sur les réseaux plus grands. Peut-être même un tri des groupes et des données avant la recherche commence. Mais cela dépend de son scénario. Ce que j'ai posté est une solution propre pour des ensembles de données relativement petits. –

0

Voulez-vous dire quelque chose comme ça?

$data = array(1, 4, 6, 7) 
$groupA = array(); 
$groupB = array(); 

foreach ((array) $data as $value) { 
    if ($value < 6) { 
     $groupA[] = $value; 
    } else { 
     $groupB[] = $value; 
    } 
} 

Greetz,

XpertEase

0

Essayez d'utiliser array_intersect avec tous les groupes ... si l'intersection non nulle, cela signifie que certains éléments sont dans ce groupe ...

0
$data = range(1,9); 

$groupA = array_filter($data, "less"); 
$groupB = array_filter($data, "more"); 


function less ($v) { 
     return $v < 6; 
} 

function more ($v) { 
     return ! less($v);  
} 

See it

Questions connexes