2010-09-22 13 views
5

decir que me comenzar con una simple matriz (que podría ser teóricamente de cualquier longitud):array dividido en pares únicos

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

Lo que la mejor solución para la división de esta matriz en una matriz de pares únicas como:

$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); 

Respuesta

3

La solución más sencilla es utilizar un bucle anidado y construir combinaciones a medida que avanza, aunque nota que la complejidad aquí es 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]); 
    } 
} 

ver esto en acción en http://www.ideone.com/9wzvP

+0

Puede escaparse con el control 'in_array' haciendo' array_unique' en '$ ids'. Y también puede acelerar arriba contando '$ ids' como precondición antes de los bucles (ya que no va a cambiar). Solo menciono estos ya que mencionas la complejidad ... – ircmaxell

+0

@ircmaxell Es cierto que primero se debe contar' $ ids', aunque eso no afectará la complejidad. No creo que puedas usar 'array_unique' antes de tiempo ... depende del objetivo del OP, es decir, si' $ ids = array (1,2,3,3) ' , debería ser [3,3] un resultado? –

+0

Puedo confirmar que 3,3 no debería ser un resultado – robjmills

1

fijo de mi sugerencia de desempate el arma inicial de array_chunk()

Tal vez puedas probar:

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

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

'array_chunk' no va a hacer lo que quiere el OP, mira el ejemplo de salida. OP quiere combinaciones. –

+0

Ah, tonto. ¡No leí la salida correctamente! –

1
Probablemente no

la mejor solución

$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); 
      } 
     } 
    } 
} 

De todos modos funciona

1

solución dulce, Nevada Stokes! me cambió el 'mientras que' declaración para evitar el bucle se rompa cuando uno de los valores es 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); 
    } 

} 
0
$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);