首页 文章

删除空数组元素

提问于
浏览
655

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

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

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

25 回答

  • 10

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

    print_r(array_filter($linksArray));
    

    请记住 if no callback is supplied ,将删除所有等于 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 !== ''; }));
    
  • 1299

    您可以使用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;
    }
    

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

    $trimmedArray = array_map('trim', $linksArray);
    
  • 149
    $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

  • 28

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

    考虑以下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');
    
  • 7
    $myarray = array_filter($myarray, 'strlen');  //removes null values but leaves "0"
        $myarray = array_filter($myarray);            //removes all null values
    
  • 6

    你可以这样做

    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 ''

  • 4
    foreach($linksArray as $key => $link) 
    { 
        if($link === '') 
        { 
            unset($linksArray[$key]); 
        } 
    } 
    print_r($linksArray);
    
  • 4

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

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

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


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

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

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

  • 10

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

    array_values(array_filter($array));
    

    另见:PHP reindex array?

  • 0

    **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
        );
    
  • 38

    简而言之:

    这是我建议的代码:

    $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://phpio.net/s/5yg0

  • 4

    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

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

    要仅筛选出 strictly false 值,必须使用回调函数:

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

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

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

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

    $filtered = array_filter($originalArray);
    
  • 7
    $a = array(1, '', '', '', 2, '', 3, 4);
    $b = array_values(array_filter($a));
    
    print_r($b)
    
  • 7

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

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

    对于多维数组

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

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

    $url = array_filter($data, function ($value) {
      return (!empty($value) || $value === 0 || $value==='0');
    });
    
  • 89
    $out_array = array_filter($input_array, function($item) 
    { 
        return !empty($item['key_of_array_to_check_whether_it_is_empty']); 
    }
    );
    
  • 9

    只想为循环提供替代方案......同时解决密钥中的空白问题......

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

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

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

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

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

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

    使用 array_filter 函数删除空值:

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

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

    $array_without_empty_values = array_filter($array);
    
  • 4
    $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

  • 23

    删除空数组元素

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

    有用!

  • 5

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

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

相关问题