删除空数组元素

我的数组中的一些元素是基于用户提交的空字符串。我需要删除这些元素。我有这个:

foreach($linksArray as $link){if($link == ''){unset($link);}}print_r($linksArray);

但是它不起作用。$linksArray仍然有空元素。我也试过用empty()函数做这件事,但结果是一样的。

1247455 次浏览
foreach($linksArray as $key => $link){if($link === ''){unset($linksArray[$key]);}}print_r($linksArray);

当您处理字符串数组时,您可以简单地使用array_filter(),它可以方便地为您处理所有这些:

print_r(array_filter($linksArray));

请记住如果没有提供回调,所有等于FALSE的数组条目(参见转换为boolean)都将被删除。因此,如果您需要保留精确字符串'0'的元素,您将需要一个自定义回调:

// PHP 7.4 and laterprint_r(array_filter($linksArray, fn($value) => !is_null($value) && $value !== ''));
// PHP 5.3 and laterprint_r(array_filter($linksArray, function($value) { return !is_null($value) && $value !== ''; }));
// PHP < 5.3print_r(array_filter($linksArray, create_function('$value', 'return $value !== "";')));

注意:如果删除空元素后需要重新索引数组,请使用:$linksArray = array_values(array_filter($linksArray));

$linksArray = array_filter($linksArray);

"如果没有提供回调,所有等于FALSE的输入条目将被删除." -- http://php.net/manual/en/function.array-filter.php

您可以使用array_filter删除空元素:

$emptyRemoved = array_filter($linksArray);

如果数组中有(int) 0,则可以使用以下命令:

$emptyRemoved = remove_empty($linksArray);
function remove_empty($array) {return array_filter($array, '_remove_empty_internal');}
function _remove_empty_internal($value) {return !empty($value) || $value === 0;}

编辑:也许你的元素本身不是空的,而是包含一个或多个空格……在使用array_filter之前,你可以使用以下内容

$trimmedArray = array_map('trim', $linksArray);

另一个用于从数组中删除空(“”空字符串)元素的衬里。

$array = array_filter($array, function($a) {return $a !== "";});

注意:此代码故意保留null0false元素。


或者你可能想先修剪数组元素:

$array = array_filter($array, function($a) {return trim($a) !== "";});

注意:此代码还删除了nullfalse元素。

    $myarray = array_filter($myarray, 'strlen');  //removes null values but leaves "0"$myarray = array_filter($myarray);            //removes all null values
function trim_array($Array){foreach ($Array as $value) {if(trim($value) === '') {$index = array_search($value, $Array);unset($Array[$index]);}}return $Array;}

我不得不这样做,以保持(string)0的数组值

$url = array_filter($data, function ($value) {return (!empty($value) || $value === 0 || $value==='0');});

我使用以下脚本从数组中删除空元素

for ($i=0; $i<$count($Array); $i++){if (empty($Array[$i])) unset($Array[$i]);}

你可以只做

array_filter($array)

array_filter:“如果没有提供回调,所有等于FALSE的输入条目都将被删除。”这意味着值为NULL,0,'0', '', FALSE, ray()的元素也将被删除。

另一种选择是

array_diff($array, array(''))

这将删除值为NULL、"和FALSE的元素。

希望有帮助:)

更新

这里有一个例子。

$a = array(0, '0', NULL, FALSE, '', array());
var_dump(array_filter($a));// array()
var_dump(array_diff($a, array(0))) // 0 / '0'// array(NULL, FALSE, '', array());
var_dump(array_diff($a, array(NULL))) // NULL / FALSE / ''// array(0, '0', array())

总结一下:

  • 0或'0'将删除0和'0'
  • NULL、FALSE或"将删除NULL、FALSE和"
foreach($arr as $key => $val){if (empty($val)) unset($arr[$key];}

使用array_filter函数删除空值:

$linksArray = array_filter($linksArray);print_r($linksArray);
$a = array(1, '', '', '', 2, '', 3, 4);$b = array_values(array_filter($a));
print_r($b)

只有一行:更新(感谢@suther):

$array_without_empty_values = array_filter($array);
$my = ("0"=>" ","1"=>"5","2"=>"6","3"=>" ");
foreach ($my as $key => $value) {if (is_null($value)) unset($my[$key]);}
foreach ($my as $key => $value) {echo   $key . ':' . $value . '<br>';}

输出

1:5

2:6

$out_array = array_filter($input_array, function($item){return !empty($item['key_of_array_to_check_whether_it_is_empty']);});

对于多维数组

$data = array_map('array_filter', $data);$data = array_filter($data);

删除空数组元素

function removeEmptyElements(&$element){if (is_array($element)) {if ($key = key($element)) {$element[$key] = array_filter($element);}
if (count($element) != count($element, COUNT_RECURSIVE)) {$element = array_filter(current($element), __FUNCTION__);}
return $element;} else {return empty($element) ? false : $element;}}
$data = array('horarios' => array(),'grupos' => array('1A' => array('Juan' => array('calificaciones' => array('Matematicas' => 8,'Español' => 5,'Ingles' => 9,),'asistencias' => array('enero' => 20,'febrero' => 10,'marzo' => '',)),'Damian' => array('calificaciones' => array('Matematicas' => 10,'Español' => '','Ingles' => 9,),'asistencias' => array('enero' => 20,'febrero' => '','marzo' => 5,)),),'1B' => array('Mariana' => array('calificaciones' => array('Matematicas' => null,'Español' => 7,'Ingles' => 9,),'asistencias' => array('enero' => null,'febrero' => 5,'marzo' => 5,)),),));
$data = array_filter($data, 'removeEmptyElements');var_dump($data);

它奏效了!

只是想贡献一个循环的替代方案……也解决了键的差距……

就我而言,我想在操作完成后保留顺序数组键(而不仅仅是奇数,这是我所盯着的。设置代码来查找奇数键对我来说似乎很脆弱,对未来不友好。)

我正在寻找更像这样的东西:http://gotofritz.net/blog/howto/removing-empty-array-elements-php/

array_filter和array_slice的结合起了作用。

$example = array_filter($example);$example = array_slice($example,0);

不知道效率或基准,但它有效。

如果您正在使用数字数组并且需要在删除空元素后重新索引数组,请使用array_values函数:

array_values(array_filter($array));

另见:PHP重索引数组?

试试这个****示例

$or = array('PersonalInformation.first_name' => $this->request->data['User']['first_name'],'PersonalInformation.last_name' => $this->request->data['User']['last_name'],'PersonalInformation.primary_phone' => $this->request->data['User']['primary_phone'],'PersonalInformation.dob' => $this->request->data['User']['dob'],'User.email' => $this->request->data['User']['email'],);


$or = array_filter($or);
$condition = array('User.role' => array('U', 'P'),'User.user_status' => array('active', 'lead', 'inactive'),'OR' => $or);

投票最多的答案是错误,或者至少不完全正确,因为OP只谈论空白字符串。这里有一个彻底的解释:

是什么意思

首先,我们必须同意是什么意思。你的意思是过滤掉:

  1. 空字符串唯一(")?
  2. 完全错误值?($element === false
  3. Falsey值?(即0、0.0、“”、“0”、NULL、数组()…)
  4. 相当于PHP的empty()函数?

你如何过滤掉这些值

过滤掉仅空字符串

$filtered = array_diff($originalArray, array(""));

要仅过滤掉严格false值,您必须使用回调函数:

$filtered = array_diff($originalArray, 'myCallback');function myCallback($var) {return $var === false;}

回调对于要过滤掉“false sey”值的任何组合也很有用,除了一些。(例如,过滤每个nullfalse,等等,只留下0):

$filtered = array_filter($originalArray, 'myCallback');function myCallback($var) {return ($var === 0 || $var === '0');}

第三种和第四种情况(最后为了我们的目的)是等价的,为此,您必须使用的就是默认值:

$filtered = array_filter($originalArray);

关于这个话题最流行的答案是绝对不正确的。

考虑以下PHP脚本:

<?php$arr = array('1', '', '2', '3', '0');// Incorrect:print_r(array_filter($arr));// Correct:print_r(array_filter($arr, 'strlen'));

这是为什么?因为包含单个'0'字符的字符串也计算为布尔假,所以即使它不是空字符串,它仍然会被过滤。这将是一个bug。

将内置strlen函数作为过滤函数传递将起作用,因为它为非空字符串返回非零整数,为空字符串返回零整数。非零整数在转换为布尔值时始终评估为true,而零整数在转换为布尔值时始终评估为false。

所以,绝对的,明确的,正确的答案是:

$arr = array_filter($arr, 'strlen');

简而言之:

这是我的建议代码:

$myarray =  array_values(array_filter(array_map('trim', $myarray), 'strlen'));

说明:

我认为使用array_filter是好的,但还不够,因为值像space\n,…保留在数组中,这通常是不好的。

所以我建议你使用混合物array_filterarray_map

array_map用于修剪,array_filter用于删除空值,strlen用于保留0值,array_values用于在需要时重新索引。

样品:

$myarray = array("\r", "\n", "\r\n", "", " ", "0", "a");
// "\r", "\n", "\r\n", " ", "a"$new1 = array_filter($myarray);
// "a"$new2 = array_filter(array_map('trim', $myarray));
// "0", "a"$new3 = array_filter(array_map('trim', $myarray), 'strlen');
// "0", "a" (reindex)$new4 = array_values(array_filter(array_map('trim', $myarray), 'strlen'));
var_dump($new1, $new2, $new3, $new4);

结果:

array(5) {[0]=>" string(1) "[1]=>string(1) ""[2]=>string(2) ""[4]=>string(1) " "[6]=>string(1) "a"}array(1) {[6]=>string(1) "a"}array(2) {[5]=>string(1) "0"[6]=>string(1) "a"}array(2) {[0]=>string(1) "0"[1]=>string(1) "a"}

线上测试:

http://sandbox.onlinephpfunctions.com/code/e02f5d8795938be9f0fa6f4c17245a9bf8777404

根据您的方法,您可以在另一个数组中捕获这些元素并使用该数组,如下所示,

foreach($linksArray as $link){if(!empty($link)){$new_arr[] = $link}}
print_r($new_arr);

有了这些类型的东西,最好明确你想要什么和不想要什么。

这将有助于下一个人在没有回调的情况下不会对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]

现在,您可以使用pipe()动态创建一个名为filterer()的函数,该函数将为您应用这些部分应用的函数。

<?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 1return 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` valuefunction ($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]

我觉得array_walk更适合这里

$linksArray = array('name', '        ', '  342', '0', 0.0, null, '', false);
array_walk($linksArray, function(&$v, $k) use (&$linksArray){$v = trim($v);if ($v == '')unset($linksArray[$k]);});print_r($linksArray);

输出:

Array([0] => name[2] => 342[3] => 0[4] => 0)
  • 我们确保即使用户添加了多个空格,空值也会被删除

  • 我们还从有效期中裁剪了空格

  • 最后,只有(null)、(Boolean False)和(")会被视为空字符串

至于False,可以删除它,因为AFAIK用户无法提交布尔值。