我的数组中的一些元素是基于用户提交的内容的空字符串 . 我需要删除这些元素 . 我有这个:
foreach($linksArray as $link) { if($link == '') { unset($link); } } print_r($linksArray);
但它不起作用, $linksArray 仍然有空元素 . 我也试过用 empty() 函数做,但结果是一样的 .
$linksArray
empty()
当你处理一个字符串数组时,你可以简单地使用array_filter(),它可以方便地为你处理所有这些:
print_r(array_filter($linksArray));
请记住 if no callback is supplied ,将删除所有等于 FALSE (参见converting to boolean)的数组条目 . 因此,如果您需要保留精确字符串 '0' 的元素,则需要自定义回调:
FALSE
'0'
// 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 ,则可以使用以下命令:
(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; }
EDIT: 也许你的元素本身不是空的,但是包含一个或多个空格......在使用array_filter之前你可以使用以下内容
$trimmedArray = array_map('trim', $linksArray);
$linksArray = array_filter($linksArray);
"If no callback is supplied, all entries of input equal to FALSE will be removed." - http://php.net/manual/en/function.array-filter.php
关于这个主题的最流行的答案绝对是不正确的 .
考虑以下PHP脚本:
<?php $arr = array('1', '', '2', '3', '0'); // Incorrect: print_r(array_filter($arr)); // Correct: print_r(array_filter($arr, 'strlen'));
为什么是这样?因为包含单个“0”字符的字符串也计算为布尔值false,所以即使它不是空字符串,它仍然会被过滤掉 . 那将是一个错误 .
将内置strlen函数作为过滤函数传递将起作用,因为它为非空字符串返回非零整数,为空字符串返回零整数 . 转换为布尔值时,非零整数始终求值为true,而转换为布尔值时,零整数始终求值为false .
所以,绝对的,明确的,正确的答案是:
$arr = array_filter($arr, 'strlen');
$myarray = array_filter($myarray, 'strlen'); //removes null values but leaves "0" $myarray = array_filter($myarray); //removes all null values
你可以这样做
array_filter($array)
array_filter:“如果没有提供回调,则将删除所有输入等于FALSE的条目 . ”这意味着具有值NULL,0,'0','',FALSE,array()的元素也将被删除 .
另一种选择是做
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或'' will remove NULL, FALSE and ''
foreach($linksArray as $key => $link) { if($link === '') { unset($linksArray[$key]); } } print_r($linksArray);
另一个用于从数组中删除空(“”空字符串)元素的衬垫 .
$array = array_filter($array, create_function('$a','return $a!=="";'));
注意:此代码故意保留null,0和false元素 .
或者您可能希望首先修剪数组元素:
$array = array_filter($array, create_function('$a','return trim($a)!=="";'));
注意:此代码还会删除null和false元素 .
如果您正在使用数值数组并且需要在删除空元素后重新索引数组,请使用 array_values 函数:
array_values(array_filter($array));
另见:PHP reindex array?
**try this ** Example
$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 );
这是我建议的代码:
$myarray = array_values(array_filter(array_map('trim', $myarray), 'strlen'));
我认为使用 array_filter 是好的,但还不够,因为值类似于 space 和 \n ,...保留在数组中,这通常很糟糕 .
array_filter
space
\n
所以我建议你使用混合物 array_filter 和 array_map .
array_map
array_map 用于修剪, array_filter 用于删除空值, strlen 用于保留 0 值, array_values 用于重新索引(如果需要) .
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://phpio.net/s/5yg0
The most voted answer is wrong or at least not completely true as the OP is talking about blank strings only. Here's a thorough explanation:
首先,我们必须就空手段达成一致 . 你的意思是过滤掉:
只有 empty strings (“”)?
strictly false 值? ( $element === false )
$element === false
falsey 值? (即0,0.0,“", " 0”,NULL,array()...)
相当于PHP的 empty() 函数?
过滤 empty strings only :
$filtered = array_diff($originalArray, array(""));
要仅筛选出 strictly false 值,必须使用回调函数:
$filtered = array_diff($originalArray, 'myCallback'); function myCallback($var) { return $var === false; }
回调对于要过滤掉"falsey"值的任何组合也很有用,除了一些 . (例如,每隔 null 和 false 等过滤,只留下 0 ):
null
false
$filtered = array_filter($originalArray, 'myCallback'); function myCallback($var) { return ($var === 0 || $var === '0'); }
第三和第四种情况(最终我们的目的)是等价的,为此您必须使用的是默认值:
$filtered = array_filter($originalArray);
$a = array(1, '', '', '', 2, '', 3, 4); $b = array_values(array_filter($a)); print_r($b)
我使用以下脚本从数组中删除空元素
for ($i=0; $i<$count($Array); $i++) { if (empty($Array[$i])) unset($Array[$i]); }
对于多维数组
$data = array_map('array_filter', $data); $data = array_filter($data);
我必须这样做才能保持(字符串)0的数组值
$url = array_filter($data, function ($value) { return (!empty($value) || $value === 0 || $value==='0'); });
$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>'; }
output
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);
有用!
根据您的方法,您可以在另一个数组中捕获这些元素并使用如下所示的元素,
foreach($linksArray as $link){ if(!empty($link)){ $new_arr[] = $link } } print_r($new_arr);
25 回答
当你处理一个字符串数组时,你可以简单地使用array_filter(),它可以方便地为你处理所有这些:
请记住 if no callback is supplied ,将删除所有等于
FALSE
(参见converting to boolean)的数组条目 . 因此,如果您需要保留精确字符串'0'
的元素,则需要自定义回调:您可以使用array_filter删除空元素:
如果阵列中有
(int) 0
,则可以使用以下命令:EDIT: 也许你的元素本身不是空的,但是包含一个或多个空格......在使用array_filter之前你可以使用以下内容
"If no callback is supplied, all entries of input equal to FALSE will be removed." - http://php.net/manual/en/function.array-filter.php
关于这个主题的最流行的答案绝对是不正确的 .
考虑以下PHP脚本:
为什么是这样?因为包含单个“0”字符的字符串也计算为布尔值false,所以即使它不是空字符串,它仍然会被过滤掉 . 那将是一个错误 .
将内置strlen函数作为过滤函数传递将起作用,因为它为非空字符串返回非零整数,为空字符串返回零整数 . 转换为布尔值时,非零整数始终求值为true,而转换为布尔值时,零整数始终求值为false .
所以,绝对的,明确的,正确的答案是:
你可以这样做
array_filter:“如果没有提供回调,则将删除所有输入等于FALSE的条目 . ”这意味着具有值NULL,0,'0','',FALSE,array()的元素也将被删除 .
另一种选择是做
这将删除值为NULL,''和FALSE的元素 .
希望这可以帮助 :)
更新
这是一个例子 .
总结一下:
0或'0'将删除0和'0'
NULL,FALSE或'' will remove NULL, FALSE and ''
另一个用于从数组中删除空(“”空字符串)元素的衬垫 .
注意:此代码故意保留null,0和false元素 .
或者您可能希望首先修剪数组元素:
注意:此代码还会删除null和false元素 .
如果您正在使用数值数组并且需要在删除空元素后重新索引数组,请使用 array_values 函数:
另见:PHP reindex array?
**try this ** Example
简而言之:
这是我建议的代码:
说明:
我认为使用
array_filter
是好的,但还不够,因为值类似于space
和\n
,...保留在数组中,这通常很糟糕 .所以我建议你使用混合物
array_filter
和array_map
.array_map
用于修剪,array_filter
用于删除空值,strlen
用于保留0
值,array_values
用于重新索引(如果需要) .样品:
结果:
在线测试:
http://phpio.net/s/5yg0
The most voted answer is wrong or at least not completely true as the OP is talking about blank strings only. Here's a thorough explanation:
空是什么意思?
首先,我们必须就空手段达成一致 . 你的意思是过滤掉:
只有 empty strings (“”)?
strictly false 值? (
$element === false
)falsey 值? (即0,0.0,“", " 0”,NULL,array()...)
相当于PHP的
empty()
函数?如何过滤掉值
过滤 empty strings only :
要仅筛选出 strictly false 值,必须使用回调函数:
回调对于要过滤掉"falsey"值的任何组合也很有用,除了一些 . (例如,每隔
null
和false
等过滤,只留下0
):第三和第四种情况(最终我们的目的)是等价的,为此您必须使用的是默认值:
我使用以下脚本从数组中删除空元素
对于多维数组
我必须这样做才能保持(字符串)0的数组值
只想为循环提供替代方案......同时解决密钥中的空白问题......
在我的情况下,我希望在操作完成时保留顺序数组键(不仅仅是奇数,这就是我正在盯着的 . 设置代码以查找奇数键对我来说似乎很脆弱而且对未来不友好 . )
我正在寻找更像这样的东西:http://gotofritz.net/blog/howto/removing-empty-array-elements-php/
array_filter和array_slice的组合起到了作用 .
$example = array_filter($example); $example = array_slice($example,0);
不知道效率或基准,但它的工作原理 .
使用
array_filter
函数删除空值:只有一行:更新(感谢@suther):
output
删除空数组元素
有用!
根据您的方法,您可以在另一个数组中捕获这些元素并使用如下所示的元素,