2012-09-13 41 views
9

tengo esta matriz:array dividido en dos matrices de índice par o impar

$array = array(a, b, c, d, e, f, g); 

quiero dividirlo en dos matrices, dependiendo si el índice es par o impar, así:

$odd = array(a, c, e, g); 

$even = array(b, d, f); 

¡Gracias de antemano!

+0

Las claves de 'B', '' d' y F' son '1',' 3' y '5' ... ¿estás seguro de que no deberían ser' $ impares'? – Krycke

Respuesta

27

Una solución, utilizando funciones anónimas y array_walk:

$odd = array(); 
$even = array(); 
$both = array(&$even, &$odd); 
array_walk($array, function($v, $k) use ($both) { $both[$k % 2][] = $v; }); 

Esto separa los elementos en una sola pasada de la matriz, pero es un poco "inteligente". No es realmente mejor que el clásico, más prolija

$odd = array(); 
$even = array(); 
foreach ($array as $k => $v) { 
    if ($k % 2 == 0) { 
     $even[] = $v; 
    } 
    else { 
     $odd[] = $v; 
    } 
} 
3

No estoy seguro de si se trata de la forma más elegante, pero debería funcionar a las mil maravillas:

$odd=array(); 
$even=array(); 
$count=1; 
foreach($array as $val) 
{ 
    if($count%2==1) 
    { 
     $odd[]=$val; 
    } 
    else 
    { 
     $even[]=$val; 
    } 
    $count++; 
} 
6

Uso array_filter:

$odd=array_filter($array, function ($input) {return $input & 1;}); 
$even=array_filter($array, function ($input) {return !($input & 1);}); 
+1

Supongo que 'array_filter' funciona en valores y no en las claves –

+0

@ClydeLobo Ah. Demasiado rápido para dar una respuesta y no leer la pregunta correctamente. – Gareth

+2

Curiosamente, parece que desde PHP 5.6 puede usar 'array_filter' por clave en lugar de valor si pasa' ARRAY_FILTER_USE_KEY' al tercer argumento opcional. – Gareth

1

Sólo bucle a través de ellas y comprobar si la clave es par o impar:

$odd = array(); 
$even = array(); 
foreach($array as $key => $value) { 
    if(0 === $key%2) { //Even 
     $even[] = $value; 
    } 
    else { 
     $odd[] = $value; 
    } 
} 
1

Una

$odd = $even = array(); 
for ($i = 0, $l = count($array); $i < $l;) { // Notice how we increment $i each time we use it below, by two in total 
    $even[] = $array[$i++]; 
    if($i < $l) 
    { 
     $odd[] = $array[$i++]; 
    } 
} 

Dos

$odd = $even = array(); 
foreach (array_chunk($array , 2) as $chunk) { 
    $even[] = $chunk[0]; 
    if(!empty($chunk[1])) 
    { 
     $odd[] = $chunk[1]; 
    } 
} 
1

Basado en @ segunda variante de Jon, he hecho este siguiente para su uso con PHP Motor de plantilla Smarty v3. Esto es para mostrar noticias/blog con un modelo de plantilla de una o dos columnas.

Después de la consulta MySql Voy a hacer el siguiente código:

if(sizeof($results) > 0) { 
    $data = array(); 
    foreach($results as $k => $res) { 
     if($k % 2 == 0) { 
      $res["class"] = "even"; 
      $data["all"][] = $data["even"][] = $res; 
     } 
     else { 
      $res["class"] = "odd"; 
      $data["all"][] = $data["odd"][] = $res; 
     } 
    } 
} 

puedo obtener una matriz de 3 sub-arrays (incluyendo incluso la clase/impar) con la sintaxis Smarty de uso:

  1. todos los artículos {foreach $data.all as $article}...{/foreach} artículos
  2. impares sólo {foreach $data.odd as $article}...{/foreach}
  3. incluso elementos sólo {foreach $data.even as $article}...{/foreach}

espero que ayuda a algunas personas ...

1
$odd = []; 
$even = []; 
while (count($arr)) { 
    $odd[] = array_shift($arr); 
    $even[] = array_shift($arr); 
} 
+0

Intenta evitar solo el código de dumping como respuesta e intenta explicar qué hace y por qué. Es posible que su código no sea obvio para las personas que no tienen la experiencia de codificación relevante. Edite su respuesta para incluir [aclaraciones, contexto e intente mencionar cualquier limitación, suposición o simplificación en su respuesta.] (Https://stackoverflow.com/help/how-to-answer) – Frits

+0

Está bromeando, ¿verdad? – DoubleThink

+0

No, no lo era. Su respuesta fue tan corta que aterrizó en la _Boda de revisión de calidad baja_. Mi comentario no se refiere a la ofensa, y su respuesta no es incorrecta, por lo que he votado a favor de que no se elimine, pero sería útil una explicación básica de lo que está haciendo. Una oración simple duplicará la calidad de tu respuesta, lo que ayuda a los nuevos usuarios futuros y mejora tus posibilidades de obtener un +1. Es una situacion donde ambos ganan. – Frits

0

Como casi de una sola línea, creo que esto va a ser mi favorito:

$even = $odd = array(); 
foreach($array as $k => $v) $k % 2 ? $odd[] = $v : $even[] = $v; 

O para un poco más pequeña?velocidad:

$even = $odd = array(); 
foreach($array as $k => $v) ($k & 1) === 0 ? $even[] = $v : $odd[] = $v; 

variante A poco más detallado:

$both = array(array(), array()); 
// or, if $array has at least two elements: 
$both = array(); 

foreach($array as $k => $v) $both[ $k % 2 ][] = $v; 
list($even, $odd) = $both; 

Con array_chunk:

$even = $odd = array(); 
foreach(array_chunk($array, 2) as $chunk){ 
    list($even[], $odd[]) = isset($chunk[1]) ? $chunk : $chunk + array(null, null); 
    // or, to force even and odd arrays to have the same count: 
    list($even[], $odd[]) = $chunk + array(null, null); 
} 

Si $ array está garantizado para tener un número par de elementos:

$even = $odd = array(); 
foreach(array_chunk($array, 2) as $chunk) 
    list($even[], $odd[]) = $chunk; 

PHP 5.5.0+ con array_column:

$chunks = array_chunk($array, 2); 
$even = array_column($chunks, 0); 
$odd = array_column($chunks, 1); 

Algo similar para versiones anteriores de PHP. Las claves serán 0,2,4, ... y 1,3,5, .... Si no te gusta esto, aplicar una array_values también:

$even = array_intersect_key($array, array_flip(range(0, count($array), 2))); 
$odd = array_intersect_key($array, array_flip(range(1, count($array), 2))); 

o

$even = array_intersect_key($array, array_fill_keys(range(0, count($array), 2), null)); 
$odd = array_intersect_key($array, array_fill_keys(range(1, count($array), 2), null));