2009-04-10 16 views
6

¿Cómo se puede filtrar las entradas de la matriz con un número de índice impar o par?Matriz de filtro - par impar

Array 
(
    [0] => string1 
    [1] => string2 
    [2] => string3 
    [3] => string4 
) 

Como, quiero que elimine las entradas [0] y [2] de la matriz. O decir que tengo 0,1,2,3,4,5,6,7,8,9 - necesitaría eliminar 0,2,4,6,8.

Respuesta

15

foreach($arr as $key => $value) if($key&1) unset($arr[$key]);

Lo anterior elimina las posiciones impares de la matriz, para eliminar incluso las posiciones numéricas, utilice la siguiente:

lugar if($key&1) puede utilizar if(!($key&1))

+0

Esto elimina todos los números impares , como [1] y [3]. ¿Cómo puedo eliminar todos los números pares, como [0], [2] ...? –

+0

simplemente cambie la sentencia if en el código de Thinker a (! $ Key & 1) ... foreach ($ arr as $ key => $ value) if (! $ Key & 1) unset ($ arr [$ key]); – artlung

+0

Eso es lo que pensé también, pero me da [1], [2], [3], pero no el [4], solo debería darme [1] y [3]. ¿Alguna idea? –

2

Aquí hay una solución "Hax":

Utilice array_filter en combinación con una función "isodd".

array_filter parece que solo funciona en valores, por lo que puede primero array_flip y luego usar array_filter.

array_flip(array_filter(array_flip($data), create_function('$a','return $a%2;'))) 
+0

create_function no es recomendable ya que tiene una pérdida de memoria. – Matt

+0

Y también son difíciles de leer :) Las funciones anónimas valdría la pena mirar cuando se lanza 5.3.0 (http://uk2.php.net/manual/en/functions.anonymous.php) – Ross

+0

Awesome, funciones anónimas! No sabía que estaban planeados, gracias –

0

lo haría así ...

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

Creo que debería ser un

+0

Ah sí, mi error. –

2

También es posible usar SPL FilterIterator así:

class IndexFilter extends FilterIterator { 
    public function __construct (array $data) { 
     parent::__construct(new ArrayIterator($data)); 
    } 

    public function accept() { 
     # return even keys only 
     return !($this->key() % 2); 
    }  
} 

$arr  = array('string1', 'string2', 'string3', 'string4'); 
$filtered = array(); 

foreach (new IndexFilter($arr) as $key => $value) { 
    $filtered[$key] = $value; 
} 

print_r($filtered); 
1
<?php 
function odd($var) 
{ 
    // returns whether the input integer is odd 
    return($var & 1); 
} 

function even($var) 
{ 
    // returns whether the input integer is even 
    return(!($var & 1)); 
} 

$array1 = array("a"=>1, "b"=>2, "c"=>3, "d"=>4, "e"=>5); 
$array2 = array(6, 7, 8, 9, 10, 11, 12); 

echo "Odd :\n"; 
print_r(array_filter($array1, "odd")); 
echo "Even:\n"; 
print_r(array_filter($array2, "even")); 
?> 

Odd : 
Array 
(
    [a] => 1 
    [c] => 3 
    [e] => 5 
) 
Even: 
Array 
(
    [0] => 6 
    [2] => 8 
    [4] => 10 
    [6] => 12 
) 
0
<?php 
$array = array(0, 3, 5, 7, 20, 10, 99,21, 14, 23, 46); 
for ($i = 0; $i < count($array); $i++) 

{ 
     if ($array[$i]%2 !=0) 
     echo $array[$i]."<br>"; 
} 
?> 
Cuestiones relacionadas