2009-04-10 20 views
6

Dizi girişlerini tek veya çift haneli bir numara ile filtreleyebilirsiniz nasıl filtreler?Filtre dizisi - tek çift

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

Benzer şekilde, [0] ve [2] girişlerini diziden kaldırmasını istiyorum. Veya 0,1,2,3,4,5,6,7,8,9 var - 0,2,4,6,8 çıkarmanız gerekir. Eğer if(!($key&1))

cevap

15

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

yukarıdaki aşağıdaki kullanın çift sayı pozisyonları kaldırmak için, diziden tek sayı pozisyonlarını kaldırır:

"isodd" işleviyle birlikte array_filter öğesini kullanın.

array_filter yalnızca değerler üzerinde çalışır gibi görünüyor, böylece ilk array_flip ve sonra array_filter kullanabilirsiniz.

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

Bu, her tek sayı kaldırır [1] ve [3] gibi. Her çift sayıyı nasıl kaldırabilirim, örneğin [0], [2] ...? –

+0

sadece (! $ Anahtar & 1) ... foreach ($ $ $ $ $ $ $ = $ $ = $ $ = $ $ $ $) $ (= $ anahtar & 1) unset ($ arr [$ key]); – artlung

+0

Ben de öyle düşündüm, ama bana [1], [2], [3] veriyor, ama [4] 'i değil, sadece bana [1] ve [3] vermeli. Düşüncesi olan var mı? –

2

Burada "hax" çözüm kullanabilirsiniz yerine

if($key&1):

+0

create_function önerilmez bir bellek sızıntısı olduğu gibi. – Matt

+0

Ve onlar da okumak zor :) Anonim fonksiyonlar 5.3.0 yayımlandığında (http://uk2.php.net/manual/en/functions.anonymous.php) – Ross

+0

Awesome anonim işlevler! Onlar planlanmış olduğunu bilmiyordum, teşekkürler –

0

böyle yapardım ...

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

Ben bir

+0

Ah evet, benim hatam olduğunu düşünüyorum. –

2

Ayrıca böyle SPL FilterIterator kullanabilirsiniz:

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>"; 
} 
?> 
İlgili konular