2009-12-07 7 views
7

Necesito combinar varias matrices en una sola matriz. La mejor manera de describir lo que estoy buscando es "entrelazar" las matrices en una sola matriz.Intercalación de matrices múltiples en una sola matriz

Por ejemplo, tome el elemento uno de la matriz n. ° 1 y anexe a la matriz final. Obtenga el elemento uno de la matriz n. ° 2 y anexe a la matriz final. Obtenga el elemento dos del conjunto n. ° 1 y anexe ... etc.

La matriz final sería algo como esto:

el arreglo # 1.element # 1 # gama 2.element # 1 . . .

El "pateador" es que las matrices individuales pueden ser de varias longitudes.

¿Existe una mejor estructura de datos para usar?

+1

Explique además cómo espera su resultado en el caso en que las matrices tengan varias longitudes. ¿Pararía el entrelazado cuando una de las matrices ha alcanzado su último elemento o desea que las matrices restantes continúen intercaladas hasta que todas las matrices hayan alcanzado su último elemento? – Oskar

Respuesta

25

por ejemplo,

function array_zip_merge() { 
    $output = array(); 
    // The loop incrementer takes each array out of the loop as it gets emptied by array_shift(). 
    for ($args = func_get_args(); count($args); $args = array_filter($args)) { 
    // &$arg allows array_shift() to change the original. 
    foreach ($args as &$arg) { 
     $output[] = array_shift($arg); 
    } 
    } 
    return $output; 
} 

// test 

$a = range(1, 10); 
$b = range('a', 'f'); 
$c = range('A', 'B'); 
echo implode('', array_zip_merge($a, $b, $c)); // prints 1aA2bB3c4d5e6f78910 
+0

Me gusta este. – Franz

+0

¡Gran pedazo de código seguro! Si alguien necesita una explicación detallada paso a paso de cómo funciona esta función, echa un vistazo a [este hilo aquí] (http://stackoverflow.com/questions/34482028/explain-how-this-custom-function-works-php) :) – Acidon

1

Simplemente usaría array_merge(), pero eso obviamente depende de lo que haga exactamente.

Esto adjuntaría esas matrices entre sí, mientras que los elementos solo se reemplazarían cuando tengan la misma clave no numérica. Y eso podría no ser un problema para usted, o podría resolverse debido al orden de los atributos, ya que los contenidos de los elementos de las primeras matrices serán sobrescritos por los posteriores.

0

Si tiene n matrices, puede usar una SortedList y usar arrayIndex * n + arrayNumber como un índice de clasificación.

3

Si las matrices sólo tienen teclas numéricas, he aquí una solución sencilla:

$longest = max(count($arr1), count($arr2)); 
$final = array(); 

for ($i = 0; $i < $longest; $i++) 
{ 
    if (isset($arr1[$i])) 
     $final[] = $arr1[$i]; 
    if (isset($arr2[$i])) 
     $final[] = $arr2[$i]; 
} 

Si ha llamado teclas que puede utilizar la función array_keys para cada matriz y el bucle sobre la matriz de teclas en su lugar.

Si desea más de dos matrices (o número variable de matrices), entonces es posible que pueda utilizar un bucle anidado (aunque creo que necesitaría tener $arr[0] y $arr[1] como matrices individuales).

Cuestiones relacionadas