2011-06-29 10 views
5

Cómo debería eliminar cada segundo elemento de una matriz como esta (usando nada más que el construido en funciones de matriz en PHP):¿Quitar cada segundo elemento de una matriz y reacomodar las claves?

$array = array('first', 'second', 'third', 'fourth', 'fifth', 'sixth', 'seventh'); 

Y cuando quito cada segundo elemento, que debería obtener:

$array = array('first', 'third', 'fifth', 'seventh'); 

¿Posible?

Respuesta

13
$array = array('first', 'second', 'third', 'fourth', 'fifth', 'sixth', 'seventh'); 
foreach (range(1, count($array), 2) as $key) { 
    unset($array[$key]); 
} 
$array = array_merge($array); 
var_dump($array); 

o

$array = array('first', 'second', 'third', 'fourth', 'fifth', 'sixth', 'seventh'); 
$size = count($array); 
$result = array(); 
for ($i = 0; $i < $size; $i += 2) { 
    $result[] = $array[$i]; 
} 
var_dump($result); 
+1

¡eres el mejor! Aceptaré tu respuesta en aproximadamente 8-10 minutos;) – metaforce

1

Sí, por supuesto.

for ($i = 0; $i < count($array); $i++) 
{ 
    if (($i % 2) == 0) unset ($array[$i]); 
} 
+0

dobar dobar;) hvala ti! – metaforce

+1

Esto no reordenará las teclas y (según la pregunta) esto eliminará 0,2,4, ..., pero deben mantenerse. 1,3,5, ... deberían eliminarse. Una "cosa" menor: no debe usar funciones en una expresión de prueba 'for', porque se llama en cualquier iteración. Además, provocará un comportamiento no deseado, ya que el tamaño de la matriz cambia (después del primer 'unset()' el tamaño ya no es '$ maxKey + 1'). – KingCrunch

+0

@KingCrunch Solo le estaba dando un ejemplo. También estoy de acuerdo con el uso de funciones en una expresión de prueba. Pero una vez más, esto es solo un ejemplo de la escuela sobre cómo debería pensar para resolver su problema. –

3

Otro abordaje con array_intersect_key:

$array = array('first', 'second', 'third', 'fourth', 'fifth', 'sixth', 'seventh'); 
$keys = range(0, count($array), 2); 
$result = array_values(array_intersect_key($array, array_combine($keys, $keys))); 
var_dump($result); 
0

La forma correcta es un inverso de bucle (junto con el módulo de costumbre) Para aquellos que buscan un copiar y pegar solución:

for ($i = count($ar)-1; $i >= 0 ; $i--){ if (($i % 2) == 0) unset ($ar[$i]); }

Cuestiones relacionadas