이러한 유형의 것들을 사용하면 원하는 것과 원하지 않는 것을 명시 적으로 나타내는 것이 좋습니다.
array_filter()
콜백 이 없는 행동에서 다음 사람이 놀라지 않도록 도와줍니다 . 예를 들어 array_filter()
제거 여부를 잊어 버렸기 때문에이 질문에 끝났습니다 NULL
. 아래 솔루션을 사용하고 답을 얻었을 때 시간을 낭비했습니다.
또한 논리는 array_filter
콜백이 전달되지 않을 때 와 같이 PHP 함수의 동작을 견딜 필요없이 코드를 다른 언어로 복사 할 수 있다는 점에서 언어에 무관합니다 .
내 솔루션에서 무슨 일이 일어나고 있는지 한눈에 알 수 있습니다. 조건을 제거하여 무언가를 유지하거나 새 조건을 추가하여 추가 값을 필터링하십시오.
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()
using 이라는 함수를 동적으로 만들 수 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]