এই ধরণের জিনিসগুলির সাথে আপনি কী চান এবং কী চান না সে সম্পর্কে স্পষ্ট হওয়া আরও ভাল।
এটি array_filter()
কলব্যাক ছাড়াই আচরণের সময় পরবর্তী লোকটিকে অবাক করে না দিয়ে সহায়তা করবে । উদাহরণস্বরূপ, আমি এই প্রশ্নটি শেষ করেছিলাম কারণ আমি array_filter()
মুছে ফেলেছি কিনা তা ভুলে গেছি NULL
। আমি সময় নষ্ট করেছিলাম যখন আমি কেবল নীচের সমাধানটি ব্যবহার করতে পারি এবং আমার উত্তর পেতে পারি।
এছাড়াও, যুক্তিটি এই অর্থে ল্যাঙ্গুয়েজিক অ্যানোগোস্টিক যে কোনও পিএইচপি ফাংশনের আচরণের অধীনে 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()
usingpipe()
<?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]