删除空的数组元素

我arrays中的一些元素是基于用户提交内容的空string。 我需要删除这些元素。 我有这个:

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

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

在处理string数组时,可以简单地使用array_filter() ,它可以方便地处理所有这些事情:

 print_r(array_filter($linksArray)); 

请记住, 如果没有提供callback ,数组的所有条目等于FALSE (参见转换为布尔值 )将被删除。 所以,如果你需要保存的元素,即确切的string'0' ,你将需要一个自定义的callback:

 // PHP < 5.3 print_r(array_filter($linksArray, create_function('$value', 'return $value !== "";'))); // PHP 5.3 and later print_r(array_filter($linksArray, function($value) { return $value !== ''; })); 

你可以使用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); 
 $linksArray = array_filter($linksArray); 

“如果没有提供callback,所有input等于FALSE的条目将被删除。” – http://php.net/manual/en/function.array-filter.php

  $myarray = array_filter($myarray, 'strlen'); //removes null values but leaves "0" $myarray = array_filter($myarray); //removes all null values 

这个话题最stream行的答案是绝对错误的。

考虑下面的PHP脚本:

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

为什么是这样? 因为包含单个“0”字符的string也计算为布尔值false,所以即使它不是空string,仍然会被过滤。 这将是一个错误。

将内置的strlen函数作为过滤函数传递将会起作用,因为它为非空string返回一个非零整数,并为空string返回一个零整数。 转换为布尔值时,非零整数总是计算为true,而转换为布尔值时总是计算为零。

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

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

你可以做

 array_filter($array) 

array_filter:“如果没有提供callback,input等于FALSE的所有条目将被删除。 这意味着值为NULL,0,'0','',FALSE,array()的元素也将被删除。

另一种select是做

 array_diff($array, array('')) 

这将删除值为NULL,“'和FALSE的元素。

希望这可以帮助 :)

UPDATE

这是一个例子。

 $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($linksArray as $key => $link) { if($link === '') { unset($linksArray[$key]); } } print_r($linksArray); 

另一个class轮从arrays中删除空的(“”空string)元素。

 $array = array_filter($array, create_function('$a','return $a!=="";')); 

注意:这段代码故意保留null,0和false元素。


或者,也许你想先修剪你的数组元素:

 $array = array_filter($array, create_function('$a','return trim($a)!=="";')); 

注意:这段代码也删除了null和false元素。

答案最多的是错误的,或者至less不完全正确,因为OP只是谈论空白string。 这是一个彻底的解释:

什么是空的意思?

首先,我们必须就什么空的手段达成一致。 你的意思是过滤掉:

  1. 空string (“”)?
  2. 严格的假值? ( $element === false
  3. 错误的价值观? (即0,0.0,“”,“0”,NULL,array()…)
  4. 相当于PHP的empty()函数?

你如何筛选出这些值?

只能过滤掉空string

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

要只过滤出严格的值,您必须使用callback函数:

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

这个callback对于任何想要过滤掉“假”值的组合都是有用的,除了一些。 (例如,过滤每个nullfalse等,只剩下0 ):

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

第三和第四种情况(最后是我们的目的)是等价的,所有你必须使用的是默认值:

 $filtered = array_filter($originalArray); 

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

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

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

 array_values(array_filter($array)); 

另请参阅: PHP重新索引数组?

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

 $url = array_filter($data, function ($value) { return (!empty($value) || $value === 0 || $value==='0'); }); 
 $a = array(1, '', '', '', 2, '', 3, 4); $b = array_values(array_filter($a)); print_r($b) 

对于multidimensional array

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

只是想贡献一个替代循环…也解决键之间的差距…

在我的情况下,我想在操作完成时保留顺序的数组键(不仅仅是奇数,这正是我所盯着的。设置代码来看奇数键对我来说似乎是脆弱的,而不是对未来友好的)。

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

array_filter和array_slice的组合是有用的。

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

没有效率或基准的想法,但它的作品。

 function trim_array($Array) { foreach ($Array as $value) if (trim($value) == "") { $index = array_search($value, $Array); unset($Array[$index]); } return $Array; } 
 foreach($arr as $key => $val){ if (empty($val)) unset($arr[$key]; } 

使用array_filter函数删除空值:

 $linksArray = array_filter($linksArray); print_r($linksArray); 

只需一行:更新(感谢@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

删除空的数组元素

 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); 

有用!

试试这个** **例子

 $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 );