Với những loại điều này, tốt hơn hết là nên nói rõ về những gì bạn muốn và không muốn.
Nó sẽ giúp anh chàng tiếp theo không bị bất ngờ trước hành vi array_filter()
không có cuộc gọi lại. Ví dụ, tôi đã kết thúc câu hỏi này bởi vì tôi đã quên nếu array_filter()
loại bỏ NULL
hay không. Tôi đã lãng phí thời gian khi tôi có thể vừa sử dụng giải pháp dưới đây và có câu trả lời của mình.
Ngoài ra, logic là ngôn ngữ không theo ngôn ngữ theo nghĩa là mã có thể được sao chép sang ngôn ngữ khác mà không phải chịu tác động của hàm php như array_filter
khi không có cuộc gọi lại nào được thông qua.
Trong giải pháp của tôi, rõ ràng trong nháy mắt về những gì đang xảy ra. Xóa một điều kiện để giữ một cái gì đó hoặc thêm một điều kiện mới để lọc các giá trị bổ sung.
Bỏ qua việc sử dụng thực tế array_filter()
vì tôi chỉ chuyển cho nó một cuộc gọi lại tùy chỉnh - bạn có thể tiếp tục và trích xuất nó ra chức năng của chính nó nếu bạn muốn. Tôi chỉ sử dụng nó như đường cho một foreach
vòng lặp.
<?php
$xs = [0, 1, 2, 3, "0", "", false, null];
$xs = array_filter($xs, function($x) {
if ($x === null) { return false; }
if ($x === false) { return false; }
if ($x === "") { return false; }
if ($x === "0") { return false; }
return true;
});
$xs = array_values($xs); // reindex array
echo "<pre>";
var_export($xs);
Một lợi ích khác của phương pháp này là bạn có thể tách các biến vị ngữ lọc thành một hàm trừu tượng để lọc một giá trị duy nhất cho mỗi mảng và xây dựng thành một giải pháp tổng hợp.
Xem ví dụ này và các ý kiến nội tuyến cho đầu ra.
<?php
/**
* @param string $valueToFilter
*
* @return \Closure A function that expects a 1d array and returns an array
* filtered of values matching $valueToFilter.
*/
function filterValue($valueToFilter)
{
return function($xs) use ($valueToFilter) {
return array_filter($xs, function($x) use ($valueToFilter) {
return $x !== $valueToFilter;
});
};
}
// partially applied functions that each expect a 1d array of values
$filterNull = filterValue(null);
$filterFalse = filterValue(false);
$filterZeroString = filterValue("0");
$filterEmptyString = filterValue("");
$xs = [0, 1, 2, 3, null, false, "0", ""];
$xs = $filterNull($xs); //=> [0, 1, 2, 3, false, "0", ""]
$xs = $filterFalse($xs); //=> [0, 1, 2, 3, "0", ""]
$xs = $filterZeroString($xs); //=> [0, 1, 2, 3, ""]
$xs = $filterEmptyString($xs); //=> [0, 1, 2, 3]
echo "<pre>";
var_export($xs); //=> [0, 1, 2, 3]
Bây giờ bạn có thể tự động tạo một hàm gọi là filterer()
sử dụng pipe()
sẽ áp dụng các hàm được áp dụng một phần này cho bạn.
<?php
/**
* Supply between 1..n functions each with an arity of 1 (that is, accepts
* one and only one argument). Versions prior to php 5.6 do not have the
* variadic operator `...` and as such require the use of `func_get_args()` to
* obtain the comma-delimited list of expressions provided via the argument
* list on function call.
*
* Example - Call the function `pipe()` like:
*
* pipe ($addOne, $multiplyByTwo);
*
* @return closure
*/
function pipe()
{
$functions = func_get_args(); // an array of callable functions [$addOne, $multiplyByTwo]
return function ($initialAccumulator) use ($functions) { // return a function with an arity of 1
return array_reduce( // chain the supplied `$arg` value through each function in the list of functions
$functions, // an array of functions to reduce over the supplied `$arg` value
function ($accumulator, $currFn) { // the reducer (a reducing function)
return $currFn($accumulator);
},
$initialAccumulator
);
};
}
/**
* @param string $valueToFilter
*
* @return \Closure A function that expects a 1d array and returns an array
* filtered of values matching $valueToFilter.
*/
function filterValue($valueToFilter)
{
return function($xs) use ($valueToFilter) {
return array_filter($xs, function($x) use ($valueToFilter) {
return $x !== $valueToFilter;
});
};
}
$filterer = pipe(
filterValue(null),
filterValue(false),
filterValue("0"),
filterValue("")
);
$xs = [0, 1, 2, 3, null, false, "0", ""];
$xs = $filterer($xs);
echo "<pre>";
var_export($xs); //=> [0, 1, 2, 3]