即使数组值为空,条件也会失败


Condition failing even if the array values are empty

我有一段代码,即使数组为空,条件也会失败。这是代码:

echo "<pre>";
print_r($_FILES['jform']['name']['gallery']);

输出

Array
(
    [0] => 
)

这是条件:

$galfile = $_FILES['jform']['name']['gallery'];
if(!empty($galfile))
{
    //do something
}

它应该失败,但程序进入if块。为什么?

正如您从print_r()中看到的,数组不是空的——它有一个元素,在另一边看起来像空白或空的。

更新

我建议您阅读POST方法上传,其中name是文件的原始名称,tmp_name是刚刚上传的临时文件的随机名称。

根据我的经验,您应该检查错误消息

你感兴趣的支票是:

foreach ( array_keys( $_FILES['jform']['gallery'] ) AS $key ) {
    if ( UPLOAD_ERR_OK == $_FILES['jform']['gallery']['error'][$key] ) {
        // do the stuff with the uploaded file in $_FILES['jform']['gallery']['tmp_name'][$key]
    }
}

请留意gallery位于name之前的阵列的名称。

正如您所看到的,您的数组不是空的,它有一个空元素。

解决方法是array_filter,它将消除空白数据

$array = array(0=>'');
$array1 = array_filter($array);
print_r($array1);
if(!empty($array1)){
  echo "has elememt";
}else{
    echo "empty";
}

这就是你需要的

更新

如果值包含多个空格,是的,这可以使用回调函数来处理

$array1 = array_filter($array,"call_back_function");
function call_back_function($val){
    return trim($val);
}

在您的案例中,print_r()告诉您galfile == array('') // 1 element is in the array

根据文件,只有array() // 0 elements被认为是空的。因此if语句执行正确。

在你的情况下,你应该写:

$galfile = $_FILES['jform']['name']['gallery'];
if(!empty($galfile) && !empty($galfile[0]) )
{
    //do something
}

当您使用数组时,在检查是否为空之前,您可以使用array_filter或类似函数对数组进行净化:

$galfile = array_filter($_FILES['jform']['name']['gallery']);
if(!empty($galfile))
{
    //do something
}

但当您使用全局数组_FILES时,更正确的是检查错误:

if($_FILES['jform']['error']['gallery'] == 0)
{
    //do something
}

附言:如果要过滤所有数组元素,可以使用filter_var_array