Tôi lo lắng về việc có bao nhiêu lập trình viên đã vô tội sao chép / dán array_values(array_filter())
phương thức vào mã của họ - Tôi tự hỏi có bao nhiêu lập trình viên vô tình gặp sự cố vì lòng tham của array_filter. Hoặc tệ hơn, có bao nhiêu người không bao giờ phát hiện ra rằng hàm xóa quá nhiều giá trị khỏi mảng ...
Tôi sẽ trình bày một giải pháp thay thế tốt hơn cho quy trình gồm hai phần là tách NULL
các phần tử khỏi một mảng và lập chỉ mục lại các khóa.
Tuy nhiên, trước tiên, điều cực kỳ quan trọng là tôi phải nhấn mạnh bản chất tham lam array_filter()
và cách điều này có thể âm thầm phá hỏng dự án của bạn. Đây là một mảng có các giá trị hỗn hợp trong đó sẽ gây ra rắc rối:
$array=['foo',NULL,'bar',0,false,null,'0',''];
Giá trị rỗng sẽ bị loại bỏ bất kể chữ hoa / thường.
Nhưng hãy nhìn vào những gì còn lại trong mảng khi chúng ta sử dụng array_values () & array_filter () :
array_values(array_filter($array));
Mảng đầu ra ($ mảng):
array (
0 => 'foo',
1 => 'bar'
)
// All empty, zero-ish, falsey values were removed too!!!
Bây giờ hãy xem những gì bạn nhận được với phương thức của tôi sử dụng array_walk () & is_null () để tạo một mảng mới được lọc:
array_walk($array,function($v)use(&$filtered){if(!is_null($v)){$filtered[]=$v;}});
Điều này có thể được viết trên nhiều dòng để dễ đọc / giải thích hơn:
array_walk( // iterate each element of an input array
$array, // this is the input array
function($v)use(&$filtered){ // $v is each value, $filter (output) is declared/modifiable
if(!is_null($v)){ // this literally checks for null values
$filtered[]=$v; // value is pushed into output with new indexes
}
}
);
Mảng đầu ra ($ filter):
array (
0 => 'foo',
1 => 'bar',
2 => 0,
3 => false,
4 => '0',
5 => '',
)
Với phương pháp của tôi, bạn nhận được các khóa được lập chỉ mục lại của mình, tất cả các giá trị không phải null và không có giá trị nào trong số các giá trị rỗng. Một lớp lót sạch, di động, đáng tin cậy cho tất cả các nhu cầu lọc null mảng của bạn. Đây là một cuộc biểu tình .
Tương tự, nếu bạn muốn loại bỏ các phần tử rỗng, false và null (giữ lại các số không), bốn phương pháp này sẽ hoạt động:
var_export(array_values(array_diff($array,[''])));
hoặc là
var_export(array_values(array_diff($array,[null])));
hoặc là
var_export(array_values(array_diff($array,[false])));
hoặc là
var_export(array_values(array_filter($array,'strlen')));
Đầu ra:
array (
0 => 'foo',
1 => 'bar',
2 => 0,
3 => '0',
)
Cuối cùng, đối với bất kỳ ai thích cú pháp của cấu trúc ngôn ngữ, bạn cũng có thể chỉ cần đẩy các giá trị đủ điều kiện vào một mảng mới để tạo chỉ mục mới.
$array=['foo', NULL, 'bar', 0, false, null, '0', ''];
$result = [];
foreach ($array as $value) {
if (strlen($value)) {
$result[] = $value;
}
}
var_export($result);