5 votes

Diviser le tableau en paires uniques

Disons que je commence avec un tableau simple (qui pourrait théoriquement être de n'importe quelle longueur) :

$ids  = array(1,2,3,4);

Quelle est la meilleure solution pour diviser ce tableau en un tableau de paires uniques, par exemple :

$pair[0] = array(1,2);
$pair[1] = array(1,3);
$pair[2] = array(1,4);
$pair[3] = array(2,3);
$pair[4] = array(2,4);
$pair[5] = array(3,4);

3voto

Daniel Vandersluis Points 30498

La solution la plus simple est d'utiliser une boucle imbriquée et de construire des combinaisons au fur et à mesure, mais notez que la complexité ici est O(n 2 ).

$ids = array(1,2,3,4,4);
$combinations = array();

$ids = array_unique($ids); // remove duplicates
$num_ids = count($ids);

for ($i = 0; $i < $num_ids; $i++)
{
  for ($j = $i+1; $j < $num_ids; $j++)
  {
    $combinations[] = array($ids[$i], $ids[$j]);
  }
}

Vous pouvez le voir en action à http://www.ideone.com/9wzvP

1voto

Nev Stokes Points 3162

Fixé par rapport à ma suggestion initiale, à savoir array_chunk()

Essayez plutôt ceci :

$ids  = array(1, 2, 3, 4);
$out = array();

while ($item = array_shift($ids)) {
    foreach ($ids as $key=>$value) {
        $out[] = array($item, $value);
    }
}

1voto

armonge Points 1872

Ce n'est probablement pas la meilleure solution

$ids  = array(1,2,3,4);

$pairs = array();
foreach($ids as $key => $data){
    foreach($ids as $subkey => $subdata){
        if( $subkey != $key){
            if(!in_array(array($subdata, $data) , $pairs) ){
                $pairs[] = array($data, $subdata);
            }
        }
    }
}

Quoi qu'il en soit, cela fonctionne

1voto

Belle solution, Nev Stokes ! J'ai modifié l'instruction 'while' pour éviter que la boucle ne s'interrompe lorsque l'une des valeurs est 0 :

$ids  = array(0, 1, 2, 3, 4);
$out = array();

while ( !is_null( $item = array_shift($ids) )  ) {
    foreach ($ids as $key=>$value) {
        $out[] = array($item, $value);
    }

}

0voto

Ankur Saxena Points 410
$ids  = array(1,2,3,4);
$result=array();
foreach($ids as $value_1)
{
  foreach($ids as $value_2)
  {
     if($value_1 !=$value_2)
     {
       $result[]=array($value_1,$value_2);
     }
   }
}
echo "<pre>";
print_r($result);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X