Bei solchen Dingen ist es viel besser, explizit anzugeben, was Sie wollen und was nicht.
Es wird dem nächsten Mann helfen, nicht überrascht zu werden, wenn er sich array_filter()
ohne Rückruf verhält. Zum Beispiel bin ich auf diese Frage gekommen, weil ich vergessen habe, ob sie array_filter()
entfernt wurde NULL
oder nicht. Ich habe Zeit verschwendet, als ich die unten stehende Lösung hätte verwenden und meine Antwort erhalten können.
Außerdem ist die Logik sprachangnostisch in dem Sinne, dass der Code in eine andere Sprache kopiert werden kann, ohne das Verhalten einer PHP-Funktion verstehen zu müssen, wie array_filter
wenn kein Rückruf übergeben wird.
In meiner Lösung ist auf einen Blick klar, was passiert. Entfernen Sie eine Bedingung, um etwas beizubehalten, oder fügen Sie eine neue Bedingung hinzu, um zusätzliche Werte zu filtern.
Ignorieren Sie die tatsächliche Verwendung von, array_filter()
da ich nur einen benutzerdefinierten Rückruf übergebe. Sie können dies auch in eine eigene Funktion extrahieren, wenn Sie dies wünschen. Ich benutze es nur als Zucker für eine foreach
Schleife.
<?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);
Ein weiterer Vorteil dieses Ansatzes besteht darin, dass Sie die Filterprädikate in eine abstrakte Funktion aufteilen können, die einen einzelnen Wert pro Array filtert und zu einer zusammensetzbaren Lösung aufbaut.
Siehe dieses Beispiel und die Inline-Kommentare für die Ausgabe.
<?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]
Jetzt können Sie dynamisch eine Funktion namens filterer()
using erstellen pipe()
, die diese teilweise angewendeten Funktionen für Sie anwendet.
<?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]