इस प्रकार की चीजों के साथ, यह स्पष्ट होना बेहतर है कि आप क्या चाहते हैं और क्या नहीं चाहते हैं।
यह अगले आदमी को array_filter()
बिना कॉलबैक के व्यवहार पर आश्चर्यचकित नहीं होने में मदद करेगा । उदाहरण के लिए, मैं इस सवाल पर समाप्त हो गया क्योंकि मैं भूल गया था कि array_filter()
हटाया गया NULL
या नहीं। मैंने समय बर्बाद किया जब मैं बस नीचे दिए गए समाधान का उपयोग कर सकता था और मेरा जवाब था।
इसके अलावा, लॉजिक इस मायने में भाषा-विज्ञान है कि कोड को किसी अन्य भाषा में कॉपी किया जा सकता है, बिना php फ़ंक्शन के व्यवहार के बिना, array_filter
जब कोई कॉलबैक पास नहीं होता है।
मेरे समाधान में, यह स्पष्ट है कि क्या हो रहा है। कुछ रखने के लिए एक सशर्त निकालें या अतिरिक्त मानों को फ़िल्टर करने के लिए एक नई शर्त जोड़ें।
वास्तविक उपयोग की उपेक्षा करें array_filter()
क्योंकि मैं अभी इसे एक कस्टम कॉलबैक पास कर रहा हूं - आप आगे बढ़ सकते हैं और यदि आप चाहते हैं तो इसे अपने स्वयं के फ़ंक्शन में निकाल सकते हैं। मैं इसे केवल एक foreach
लूप के लिए चीनी के रूप में उपयोग कर रहा हूं ।
<?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);
इस दृष्टिकोण का एक और लाभ यह है कि आप फ़िल्टरिंग को एक अमूर्त फ़ंक्शन में विभाजित कर सकते हैं जो एक सरणी प्रति एकल मान को फ़िल्टर करता है और एक कंपोजेबल समाधान तक बनाता है।
इस उदाहरण और आउटपुट के लिए इनलाइन टिप्पणियां देखें।
<?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]
अब आप गतिशील रूप से एक फ़ंक्शन बना सकते हैं जिसका filterer()
उपयोग करके pipe()
आप के लिए ये आंशिक रूप से लागू किए गए फ़ंक्शन लागू होंगे।
<?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]