Bu tür şeylerle, ne istediğiniz ve ne istemediğiniz konusunda açık olmak çok daha iyidir.
Bir sonraki erkeğin, array_filter()
geri arama olmadan davranışına sürprizlerle yakalanmamasına yardımcı olacaktır . Örneğin, bu soruya son verdim çünkü array_filter()
kaldırılıp kaldırılmadığını unuttum NULL
. Aşağıdaki çözümü yeni kullanabileceğim ve cevabımı alabileceğim zaman harcadım.
Ayrıca, mantık, array_filter
herhangi bir geri arama geçirilmediğinde olduğu gibi, bir php işlevinin davranışının altında durmak zorunda kalmadan kodun başka bir dile kopyalanabilmesi anlamında dil tanılamasıdır .
Benim çözümümde, neler olduğuna dair bir bakışta açıktır. Bir şeyi saklamak için bir koşulu kaldırın veya ek değerlere filtre uygulamak için yeni bir koşul ekleyin.
array_filter()
Sadece özel bir geri arama geçirdiğim için asıl kullanımını dikkate almayın - devam edip isterseniz kendi işlevine çıkarabilirsiniz. Sadece bir foreach
ilmek için şeker olarak kullanıyorum .
<?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);
Bu yaklaşımın bir başka yararı da, filtreleme tahminlerini dizi başına tek bir değeri filtreleyen soyut bir işleve ayırabilmeniz ve oluşturulabilir bir çözüm oluşturabilmenizdir.
Bu örneğe ve çıktı için satır içi yorumlara bakın.
<?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]
Şimdi dinamik adlı bir işlev oluşturabilirsiniz filterer()
kullanarak pipe()
sizin için bu kısmen uygulanan işlevleri geçerli olacaktır.
<?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]