删除空数组元素

Wil*_*ill 744 php arrays string

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

foreach($linksArray as $link)
{
    if($link == '')
    {
        unset($link);
    }
}
print_r($linksArray);
Run Code Online (Sandbox Code Playgroud)

但它不起作用,$linksArray仍然有空元素.我也尝试过使用该empty()功能,但结果是一样的.

Bol*_*ock 1477

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

print_r(array_filter($linksArray));
Run Code Online (Sandbox Code Playgroud)

请记住,如果没有提供回调,则将删除所有等于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 !is_null($value) && $value !== ''; }));
Run Code Online (Sandbox Code Playgroud)

  • 注意array_filter不重新索引数组索引(在for语句中使用进程数组时可能会出现问题).所以用array_values函数包装它. (70认同)
  • `array_filter`应该删除空元素.如果PHP的空定义与您的定义不完全相同,那么您可以使用匿名函数填充回调选项,该函数会抛出不需要的元素.显然你必须使用php 5.3或更高版本才能使用匿名回拨.http://stackoverflow.com/questions/2412299/how-do-you-use-anonymous-functions-in-php (14认同)
  • 答案是不正确的,因为它也会删除`false`元素.(http://php.net/manual/en/function.array-filter.php) (6认同)
  • @Deji你有没有尝试过滤那个数组?我认为第二次设置'a`只会重置第一次. (4认同)
  • @Cranio:已经被另一条评论所涵盖.这不是错误的,但可能*比****要求更宽*.这并不意味着其他人仍然无法发现它有用; 毕竟,如果您拥有的只是数组中的字符串,则此答案将仅删除空字符串. (4认同)
  • 我会在`==''`上使用`empty`.但感谢参考:) (2认同)

And*_*ore 162

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

$emptyRemoved = array_filter($linksArray);
Run Code Online (Sandbox Code Playgroud)

如果您有(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;
}
Run Code Online (Sandbox Code Playgroud)

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

$trimmedArray = array_map('trim', $linksArray);
Run Code Online (Sandbox Code Playgroud)

  • 我刚刚将它添加到BoltClock接受的答案中,您可以简单地执行array_filter($ foo,'strlen')以避免出现"0"问题并仅删除长度为零的那些问题. (8认同)
  • @nezZario:假设你的阵列中只有`scalar`项目.否则,你不能这样做. (2认同)
  • 使用lambda for php> = 5.3`function remove_empty($ array){return array_filter($ array,function($ value){return!empty($ value)|| $ value === 0;}); }` (2认同)
  • `array_map()` 发挥了神奇作用,因为我在那些空数组中有空格! (2认同)

小智 112

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

考虑以下PHP脚本:

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

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

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

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

$arr = array_filter($arr, 'strlen');
Run Code Online (Sandbox Code Playgroud)

  • 它们不是不正确的,而是关于上下文的。在某些情况下,保留值0可能很重要。所以请不要说每个人都错了 (3认同)
  • 如果数组包含另一个数组,则会中断:`strlen()期望参数1为字符串,给定数组。 (3认同)
  • 同意 对于那些数组包含字符串的用户,这应该是可接受的答案 (2认同)
  • 赞成。一个比许多其他答案更好的答案,但是应该注意的是,当前接受的答案在技术上并没有错,因为“空”确实在 PHP 中具有特殊含义。(一些符合“空”条件的值:`0`、`""`、`null`) (2认同)

tam*_*asd 98

$linksArray = array_filter($linksArray);
Run Code Online (Sandbox Code Playgroud)

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

  • 这也将删除'0' (18认同)
  • 谷歌解决问题之后我也试过这个.不幸的是,它留给我的空白元素. (4认同)
  • @Will:你确定吗?它也删除了空字符串,我成功测试了这个.也许您的输入值包含空格,之前应该进行修剪.根据[布尔转换规则](http://de3.php.net/manual/en/language.types.boolean.php#language.types.boolean.casting),空字符串被评估为false,因此被删除array_filter. (2认同)

mat*_*jan 51

    $myarray = array_filter($myarray, 'strlen');  //removes null values but leaves "0"
    $myarray = array_filter($myarray);            //removes all null values
Run Code Online (Sandbox Code Playgroud)


hel*_*pse 41

你可以这样做

array_filter($array)
Run Code Online (Sandbox Code Playgroud)

array_filter:"如果没有提供回调,则将删除所有输入等于FALSE的条目." 这意味着具有值NULL,0,'0','',FALSE,array()的元素也将被删除.

另一种选择是做

array_diff($array, array(''))
Run Code Online (Sandbox Code Playgroud)

这将删除值为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())
Run Code Online (Sandbox Code Playgroud)

总结一下:

  • 0或'0'将删除0和'0'
  • NULL,FALSE或''将删除NULL,FALSE和''


Mar*_*ker 35

foreach($linksArray as $key => $link) 
{ 
    if($link === '') 
    { 
        unset($linksArray[$key]); 
    } 
} 
print_r($linksArray); 
Run Code Online (Sandbox Code Playgroud)

  • 一个简洁,可读和安全的解决方案,不会删除`false`和`0`.考虑到这个被发布**与接受的答案相同的分钟**(这是不安全和不正确的),我只能假设你的8个upvotes相比接受的答案649归结为后者是单行解决方案. (4认同)

mar*_*out 30

另一个用于从数组中删除空(""空字符串)元素的衬垫.

$array = array_filter($array, function($a) {return $a !== "";});
Run Code Online (Sandbox Code Playgroud)

注意:此代码故意保留null,0和false元素.


或者您可能希望首先修剪数组元素:

$array = array_filter($array, function($a) {
    return trim($a) !== "";
});
Run Code Online (Sandbox Code Playgroud)

注意:此代码还会删除null和false元素.

  • 正是我所需要的,这也与[旧的PHP](http://stackoverflow.com/questions/6485336/closures-or-create-function-in-php)兼容,谢谢!;-) (3认同)

Nab*_*.Z. 18

简而言之:

这是我建议的代码:

$myarray =  array_values(array_filter(array_map('trim', $myarray), 'strlen'));
Run Code Online (Sandbox Code Playgroud)

说明:

我认为使用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);
Run Code Online (Sandbox Code Playgroud)

结果:

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"
}
Run Code Online (Sandbox Code Playgroud)

在线测试:

http://phpio.net/s/5yg0


mul*_*uin 11

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

array_values(array_filter($array));
Run Code Online (Sandbox Code Playgroud)

另见:PHP reindex数组?


Cra*_*nio 11

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

什么是空的意思?

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

  1. 空字符串只("")?
  2. 严格假值?($element === false)
  3. falsey值?(即0,0.0,"","0",NULL,array()...)
  4. 相当于PHP的empty()功能?

你如何过滤掉这些价值观

过滤掉空字符串:

$filtered = array_diff($originalArray, array(""));
Run Code Online (Sandbox Code Playgroud)

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

$filtered = array_diff($originalArray, 'myCallback');
function myCallback($var) {
    return $var === false;
}
Run Code Online (Sandbox Code Playgroud)

回调对于您想要过滤掉"falsey"值的任何组合也很有用,除了一些.(例如,过滤器的每个nullfalse等,只留下0):

$filtered = array_filter($originalArray, 'myCallback');
function myCallback($var) {
    return ($var === 0 || $var === '0');
}
Run Code Online (Sandbox Code Playgroud)

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

$filtered = array_filter($originalArray);
Run Code Online (Sandbox Code Playgroud)

  • 如果你想取出`null`和`false`,但是留0,你也可以使用php的内置`strlen`函数作为你的回调. (2认同)

Mat*_*att 9

我必须这样做才能保持(字符串)0的数组值

$url = array_filter($data, function ($value) {
  return (!empty($value) || $value === 0 || $value==='0');
});
Run Code Online (Sandbox Code Playgroud)


use*_*140 9

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

print_r($b)
Run Code Online (Sandbox Code Playgroud)


小智 8

function trim_array($Array)
{
    foreach ($Array as $value) {
        if(trim($value) === '') {
            $index = array_search($value, $Array);
            unset($Array[$index]);
        }
    }
    return $Array;
}
Run Code Online (Sandbox Code Playgroud)


小智 8

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


HMa*_*gdy 8

For multidimensional array

$data = array_map('array_filter', $data);
$data = array_filter($data);
Run Code Online (Sandbox Code Playgroud)


小智 7

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

for ($i=0; $i<$count($Array); $i++)
  {
    if (empty($Array[$i])) unset($Array[$i]);
  }
Run Code Online (Sandbox Code Playgroud)


Mat*_*att 6

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

$array_without_empty_values = array_filter($array);
Run Code Online (Sandbox Code Playgroud)


小智 6

只是想为循环做出贡献......也解决密钥中的空白问题......

在我的情况下,我希望在操作完成时保留顺序数组键(不仅仅是奇数,这就是我正在盯着的.设置代码以查找奇数键对我来说似乎很脆弱而且对未来不友好.)

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

array_filter和array_slice的组合起到了作用.

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

不知道效率或基准,但它的工作原理.


小智 5

foreach($arr as $key => $val){
   if (empty($val)) unset($arr[$key];
}
Run Code Online (Sandbox Code Playgroud)


小智 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>';
} 
Run Code Online (Sandbox Code Playgroud)

输出

1:5

2:6