2010-04-16 24 views
30

nếu tôi lọc một mảng với array_filter để loại bỏ giá trị null, khóa được giữ nguyên và "lỗ hổng" được tạo ra trong mảng. Ví dụ:php array_filter không có bảo toàn khóa

The filtered version of 
    [0] => 'foo' 
    [1] => null 
    [2] => 'bar' 
is 
    [0] => 'foo' 
    [2] => 'bar' 

Làm thế nào tôi có thể nhận được, thay vì

[0] => 'foo' 
[1] => 'bar' 

? Cảm ơn

Trả lời

61

Bạn có thể sử dụng array_values sau khi lọc để nhận các giá trị.

0

Sử dụng đầu vào này:

$array=['foo',NULL,'bar',0,false,null,'0','']; 

Có một vài cách để bạn có thể làm điều đó. Demo

Nó hơi off-topic để đưa lên hành vi mặc định tham lam array_filter 's, nhưng nếu bạn đang googling trang này, đây có lẽ là thông tin quan trọng liên quan đến dự án của bạn/nhiệm vụ:

var_export(array_values(array_filter($array))); // NOT GOOD!!!!! 

Bad Output :

array (
    0 => 'foo', 
    1 => 'bar', 
) 

Bây giờ cho những cách mà sẽ làm việc:

Phương pháp # 1: (array_values(), array_filter() w/!is_null())

var_export(array_values(array_filter($array,function($v){return !is_null($v);}))); // good 

Phương pháp # 2: (foreach(), tự động lập chỉ mục mảng, !==null)

foreach($array as $v){ 
    if($v!==null){$result[]=$v;} 
} 
var_export($result); // good 

Phương pháp # 3: (array_walk(), mảng chỉ mục tự động, !is_null())

array_walk($array,function($v)use(&$filtered){if(!is_null($v)){$filtered[]=$v;}}); 
var_export($filtered); // good 

Cả ba phương pháp cung cấp sau đây "null-free" đầu ra:

array (
    0 => 'foo', 
    1 => 'bar', 
    2 => 0, 
    3 => false, 
    4 => '0', 
    5 => '', 
) 
Các vấn đề liên quan