2009-04-10 38 views
6

Làm cách nào để lọc ra các mục nhập mảng có số chỉ mục lẻ hoặc số chẵn?Mảng lọc - lẻ thậm chí

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

Giống như, tôi muốn xóa các mục nhập [0] và [2] khỏi mảng. Hoặc nói rằng tôi có 0,1,2,3,4,5,6,7,8,9 - tôi sẽ cần phải loại bỏ 0,2,4,6,8.

Trả lời

15

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

Trên đây loại bỏ vị trí số lẻ từ mảng, để loại bỏ ngay cả vị trí số, sử dụng như sau:

Thay vào đó if($key&1) bạn có thể sử dụng if(!($key&1))

+0

này loại bỏ tất cả các số lẻ , như [1] và [3]. Làm thế nào tôi có thể loại bỏ mọi số chẵn, như [0], [2] ...? –

+0

chỉ cần thay đổi câu lệnh if trong mã của nhà tư tưởng thành (! $ Key & 1) ... foreach ($ arr là $ key => $ value) nếu (! $ Key & 1) unset ($ arr [$ key]); – artlung

+0

Đó cũng là những gì tôi nghĩ, nhưng nó mang lại cho tôi [1], [2], [3], nhưng không phải [4], nó chỉ cho tôi [1] và [3]. Có suy nghĩ gì không? –

2

Dưới đây là một "HAX" giải pháp:

Sử dụng array_filter kết hợp với hàm "isodd".

array_filter dường như chỉ hoạt động trên các giá trị, vì vậy trước tiên bạn có thể array_flip và sau đó sử dụng array_filter.

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

create_function không được khuyến khích vì nó có rò rỉ bộ nhớ. – Matt

+0

Và chúng cũng khó đọc :) Các hàm ẩn danh sẽ đáng để xem xét khi nào 5.3.0 được phát hành (http://uk2.php.net/manual/en/functions.anonymous.php) – Ross

+0

Tuyệt vời, chức năng ẩn danh! Không biết rằng họ đã được lên kế hoạch, cảm ơn –

0

tôi muốn làm điều đó như thế này ...

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

Tôi nghĩ rằng đó nên là một

+0

Ah có, sai lầm của tôi. –

2

Bạn cũng có thể sử dụng SPL FilterIterator như thế này:

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>"; 
} 
?> 
Các vấn đề liên quan