根据用户提交的内容,我的数组中的某些元素是空字符串。我需要删除这些元素。我有这个:
foreach($linksArray as $link)
{
if($link == '')
{
unset($link);
}
}
print_r($linksArray);
但它不起作用,$linksArray
仍然有空元素。我也尝试使用empty()
函数,但结果是一样的。
答案 0 :(得分:1398)
当您处理一系列字符串时,您可以简单地使用array_filter()
,它可以方便地为您处理所有这些:
print_r(array_filter($linksArray));
请注意如果未提供回调,则会删除所有等于FALSE
的数组条目(请参阅converting to boolean)。因此,如果您需要保留精确字符串'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 !== ''; }));
答案 1 :(得分:156)
您可以使用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);
答案 2 :(得分:102)
关于这个主题的最流行的答案绝对是不正确的。
考虑以下PHP脚本:
<?php
$arr = array('1', '', '2', '3', '0');
// Incorrect:
print_r(array_filter($arr));
// Correct:
print_r(array_filter($arr, 'strlen'));
这是为什么?因为一个字符串包含一个&#39; 0&#39; character也计算为布尔值false,因此即使它不是空字符串,它仍然会被过滤掉。那将是一个错误。
将内置strlen函数作为过滤函数传递将起作用,因为它为非空字符串返回非零整数,为空字符串返回零整数。转换为布尔值时,非零整数始终求值为true,而转换为布尔值时,零整数始终求值为false。
所以,绝对的,明确的,正确的答案是:
$arr = array_filter($arr, 'strlen');
答案 3 :(得分:96)
$linksArray = array_filter($linksArray);
“如果没有提供回调,则将删除所有输入等于FALSE的条目。” - http://php.net/manual/en/function.array-filter.php
答案 4 :(得分:51)
$myarray = array_filter($myarray, 'strlen'); //removes null values but leaves "0"
$myarray = array_filter($myarray); //removes all null values
答案 5 :(得分:41)
你可以做到
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())
总结一下:
答案 6 :(得分:33)
foreach($linksArray as $key => $link)
{
if($link === '')
{
unset($linksArray[$key]);
}
}
print_r($linksArray);
答案 7 :(得分:25)
另一个用于从数组中删除空(“”空字符串)元素的衬垫。
$array = array_filter($array, function($a) {return $a !== "";});
注意:此代码故意保留null
,0
和false
元素。
或者您可能想先修剪数组元素:
$array = array_filter($array, function($a) {
return trim($a) !== "";
});
注意:此代码还会删除null
和false
元素。
答案 8 :(得分:15)
这是我建议的代码:
$myarray = array_values(array_filter(array_map('trim', $myarray), 'strlen'));
我认为使用array_filter
是好的,但还不够,因为值类似于space
和\n
,...保留在数组中,这通常很糟糕。
因此,我建议您使用混合array_filter
和array_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"
}
答案 9 :(得分:11)
投票最多的答案是错误或至少不完全正确,因为OP只讨论空白字符串。这是一个彻底的解释:
首先,我们必须就 empty 的含义达成一致。你的意思是过滤掉:
$element === false
)empty()
函数?过滤掉空字符串:
$filtered = array_diff($originalArray, array(""));
要仅过滤掉严格 false 值,您必须使用回调功能:
$filtered = array_diff($originalArray, 'myCallback');
function myCallback($var) {
return $var === false;
}
回调对于您想要过滤掉“falsey”值的任何组合也很有用,除了一些。 (例如,过滤每个null
和false
等,只留下0
):
$filtered = array_filter($originalArray, 'myCallback');
function myCallback($var) {
return ($var === 0 || $var === '0');
}
第三和第四种情况(最终我们的目的)是等价的,为此您必须使用的是默认情况:
$filtered = array_filter($originalArray);
答案 10 :(得分:11)
如果您正在处理数值数组并需要在删除空元素后重新索引数组,请使用 array_values 函数:
array_values(array_filter($array));
答案 11 :(得分:9)
我必须这样做才能保持数组值(字符串)0
$url = array_filter($data, function ($value) {
return (!empty($value) || $value === 0 || $value==='0');
});
答案 12 :(得分:8)
$a = array(1, '', '', '', 2, '', 3, 4);
$b = array_values(array_filter($a));
print_r($b)
答案 13 :(得分:8)
$out_array = array_filter($input_array, function($item)
{
return !empty($item['key_of_array_to_check_whether_it_is_empty']);
}
);
答案 14 :(得分:8)
对于多维数组
$data = array_map('array_filter', $data);
$data = array_filter($data);
答案 15 :(得分:8)
function trim_array($Array)
{
foreach ($Array as $value) {
if(trim($value) === '') {
$index = array_search($value, $Array);
unset($Array[$index]);
}
}
return $Array;
}
答案 16 :(得分:7)
我使用以下脚本从数组中删除空元素
for ($i=0; $i<$count($Array); $i++)
{
if (empty($Array[$i])) unset($Array[$i]);
}
答案 17 :(得分:6)
只想为循环做出贡献......也解决密钥中的空白......
在我的情况下,我希望在操作完成时保留顺序数组键(不仅仅是奇数,这就是我正在盯着的。设置代码以查找奇数键对我来说似乎很脆弱而且对未来不友好。)
我正在寻找更像这样的东西:http://gotofritz.net/blog/howto/removing-empty-array-elements-php/
array_filter和array_slice的组合起到了作用。
$example = array_filter($example);
$example = array_slice($example,0);
不知道效率或基准但它有效。
答案 18 :(得分:5)
foreach($arr as $key => $val){
if (empty($val)) unset($arr[$key];
}
答案 19 :(得分:5)
$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
答案 20 :(得分:4)
只需一行: 更新(感谢@suther):
$array_without_empty_values = array_filter($array);
答案 21 :(得分:4)
使用array_filter
函数删除空值:
$linksArray = array_filter($linksArray);
print_r($linksArray);
答案 22 :(得分:3)
删除空数组元素
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);
¡它有效!
答案 23 :(得分:2)
根据您的方法,您可以在另一个数组中捕获这些元素,并使用下面的那个元素,
foreach($linksArray as $link){
if(!empty($link)){
$new_arr[] = $link
}
}
print_r($new_arr);
答案 24 :(得分:1)
试试这个** **实施例强>
$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
);
答案 25 :(得分:0)
有了这些类型的东西,最好清楚地表明自己想要和不想要的东西。
这将有助于下一个人在没有回调的情况下对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()
动态创建一个名为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]
答案 26 :(得分:0)
我认为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用户无法提交布尔值。