我的数组中的一些元素是基于用户提交的空字符串。我需要移除这些元素。我有这个:
foreach($linksArray as $link)
{
if($link == '')
{
unset($link);
}
}
print_r($linksArray);
但这并不奏效。$linksArray仍然有空元素。我也尝试过用empty()函数这样做,但结果是一样的。
我的数组中的一些元素是基于用户提交的空字符串。我需要移除这些元素。我有这个:
foreach($linksArray as $link)
{
if($link == '')
{
unset($link);
}
}
print_r($linksArray);
但这并不奏效。$linksArray仍然有空元素。我也尝试过用empty()函数这样做,但结果是一样的。
当前回答
投票最多的答案是错误的,或者至少不完全正确,因为OP只谈论空白字符串。下面是详细的解释:
空是什么意思?
首先,我们必须对空的意思达成一致。你的意思是过滤掉:
空字符串("")? 严格错误的值?($element === false) 虚假的价值观?(即0,0.0,"","0",NULL, array()…) PHP的empty()函数?
如何过滤出这些值
只过滤空字符串:
$filtered = array_diff($originalArray, array(""));
为了只过滤出严格的假值,你必须使用回调函数:
$filtered = array_diff($originalArray, 'myCallback');
function myCallback($var) {
return $var === false;
}
回调对于想要过滤掉“假”值的任何组合也很有用,除了一些。(例如,过滤每个null和false,等等,只留下0):
$filtered = array_filter($originalArray, 'myCallback');
function myCallback($var) {
return ($var === 0 || $var === '0');
}
第三种情况和第四种情况是相同的(最后为了我们的目的),为此你必须使用默认值:
$filtered = array_filter($originalArray);
其他回答
对于这些类型的事情,明确你想要什么和不想要什么要好得多。
它将帮助下一个人不会惊讶于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]
现在,您可以使用pipe()动态地创建一个名为filter()的函数,该函数将为您应用这些部分应用的函数。
<?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]
$out_array = array_filter($input_array, function($item)
{
return !empty($item['key_of_array_to_check_whether_it_is_empty']);
}
);
如果你正在处理一个数值数组,并且需要在删除空元素后重新索引数组,请使用array_values函数:
array_values(array_filter($array));
另参见:PHP重索引数组?
foreach($arr as $key => $val){
if (empty($val)) unset($arr[$key];
}
$myarray = array_filter($myarray, 'strlen'); //removes null values but leaves "0"
$myarray = array_filter($myarray); //removes all null values