ฉันกังวลว่ามีโปรแกรมเมอร์กี่คนที่คัดลอก / วางarray_values(array_filter())
วิธีการลงในรหัสโดยบริสุทธิ์ใจ - ฉันสงสัยว่ามีโปรแกรมเมอร์กี่คนที่ประสบปัญหาโดยไม่รู้ตัวเนื่องจากความโลภของ array_filter หรือแย่กว่านั้นมีกี่คนที่ไม่เคยค้นพบว่าฟังก์ชันนี้ล้างค่าออกจากอาร์เรย์มากเกินไป ...
ฉันจะนำเสนอทางเลือกที่ดีกว่าสำหรับกระบวนการลอกNULL
องค์ประกอบสองส่วนจากอาร์เรย์และจัดทำดัชนีคีย์ใหม่
อย่างไรก็ตามประการแรกเป็นสิ่งสำคัญอย่างยิ่งที่ฉันต้องเน้นย้ำถึงธรรมชาติที่ละโมบarray_filter()
และวิธีนี้จะทำให้โครงการของคุณเงียบลง นี่คืออาร์เรย์ที่มีค่าผสมอยู่ซึ่งจะทำให้เกิดปัญหา:
$array=['foo',NULL,'bar',0,false,null,'0',''];
ค่า Null จะถูกลบออกโดยไม่คำนึงถึงตัวพิมพ์ใหญ่ / ตัวพิมพ์เล็ก
แต่ดูสิ่งที่ยังคงอยู่ในอาร์เรย์เมื่อเราใช้array_values () & array_filter () :
array_values(array_filter($array));
อาร์เรย์เอาต์พุต ($ array):
array (
0 => 'foo',
1 => 'bar'
)
// All empty, zero-ish, falsey values were removed too!!!
ตอนนี้ดูสิ่งที่คุณได้รับจากวิธีการของฉันที่ใช้array_walk () & is_null ()เพื่อสร้างอาร์เรย์ที่กรองใหม่:
array_walk($array,function($v)use(&$filtered){if(!is_null($v)){$filtered[]=$v;}});
สามารถเขียนทับได้หลายบรรทัดเพื่อให้อ่าน / อธิบายได้ง่ายขึ้น:
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
}
}
);
อาร์เรย์เอาต์พุต (ตัวกรอง $):
array (
0 => 'foo',
1 => 'bar',
2 => 0,
3 => false,
4 => '0',
5 => '',
)
ด้วยวิธีการของฉันคุณจะได้รับคีย์ที่จัดทำดัชนีใหม่ของคุณค่าที่ไม่ใช่ค่าว่างทั้งหมดและไม่มีค่าว่างเลย ซับในที่สะอาดพกพาสะดวกเชื่อถือได้สำหรับความต้องการในการกรองอาร์เรย์ทั้งหมดของคุณ นี่คือการสาธิต
ในทำนองเดียวกันหากคุณต้องการลบองค์ประกอบว่างเปล่าเท็จและว่าง (การเก็บค่าศูนย์) สี่วิธีนี้จะใช้ได้ผล:
var_export(array_values(array_diff($array,[''])));
หรือ
var_export(array_values(array_diff($array,[null])));
หรือ
var_export(array_values(array_diff($array,[false])));
หรือ
var_export(array_values(array_filter($array,'strlen')));
เอาท์พุต:
array (
0 => 'foo',
1 => 'bar',
2 => 0,
3 => '0',
)
สุดท้ายสำหรับใครก็ตามที่ชอบไวยากรณ์ของโครงสร้างภาษาคุณยังสามารถพุชค่าที่มีคุณสมบัติเหมาะสมลงในอาร์เรย์ใหม่เพื่อสร้างดัชนีใหม่ได้
$array=['foo', NULL, 'bar', 0, false, null, '0', ''];
$result = [];
foreach ($array as $value) {
if (strlen($value)) {
$result[] = $value;
}
}
var_export($result);