提问



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


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


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

最佳参考


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


print_r(array_filter($linksArray));


请记住如果没有提供回调,则将删除所有等于FALSE的数组条目(请参阅转换为布尔值)。因此,如果您需要保留精确字符串'0'的元素,则需要自定义回调:[64]


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


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


$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 [66]之前,您可以使用以下内容


$trimmedArray = array_map('trim', $linksArray);

其它参考2


$linksArray = array_filter($linksArray);


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

其它参考3


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


考虑以下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');

其它参考4


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

其它参考5


你可以这样做


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或将删除NULL,FALSE和


其它参考6


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

其它参考7


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


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


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





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


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


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

其它参考8


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


为空是什么意思?



首先,我们必须就 empty 的含义达成一致。你的意思是过滤掉:



  1. 空字符串仅限()?

  2. 严格错误值? ($element === false)

  3. falsey 值? (即0,0.0,,0,NULL,array()...)

  4. 相当于PHP的empty()函数?



如何过滤掉值



要过滤掉仅空字符串:


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


要仅过滤掉严格 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);

其它参考9


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

print_r($b)

其它参考10


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


array_values(array_filter($array));


另见:PHP reindex数组?

其它参考11


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


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

其它参考12


对于多维数组


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

其它参考13


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


$url = array_filter($data, function ($value) {
  return (!empty($value) || $value === 0 || $value==='0');
});

其它参考14


简而言之:



这是我建议的代码:


$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[70]

其它参考15


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

其它参考16


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


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


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


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


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


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

其它参考17


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

其它参考18


foreach($arr as $key => $val){
   if (empty($val)) unset($arr[$key];
}

其它参考19


使用array_filter函数删除空值:


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

其它参考20


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


$array_without_empty_values = array_filter($array);

其它参考21


$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


其它参考22


删除空数组元素


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


试试这个**
**实施例



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

其它参考24


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


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

print_r($new_arr);