php 数组去除空值array_filter()方法

 更新时间:2016年11月25日 16:47  点击:2146
在php中数组去除空值的方法有很多种,一种是直接使用函数array_filter()删除空值,另一种是使用遍历判断为空然后利用unset删除数组。

函数名:array_filter()
调用方式:array_filter($array)
参数说明:$array 是操作的对象,我们将删除其中的空元素

实例:

 代码如下 复制代码

<?php
    $array = ('a' => "abc", 'b' => "bcd",'c' =>"cde",'d' =>"def",'e'=>"");
    array_filter($array);
    echo "<pre>";
    print_r($array);
?>

结果:

Array (

     [a] => abc

     [b] => bcd

     [c] => cde

    [d] => def

   )

foreach或者while的,利用这两个语法结构来删除数组中的空元素,简单代码如下:

 代码如下 复制代码

<?php
foreach( $arr as $k=&gt;$v){
if( !$v )
unset( $arr[$k] );
}
>

而且自我感觉还挺不错,只是这样的效率并不高也曾经试过,先将$arr转为对象,然后利用对象的特性来删除,因为:foreach是将当前操作的数组进

行copy,每操作一下foreach,都是copy了一个变量,页面里面如果有太多的foreach,会是一个很大的消耗。

在php中pathinfo()与parse_url()函数都可以获取url的信息,但是个人感觉这两个函数几乎没有什么共同之处呀,下面我来转一篇关于pathinfo()与parse_url()函数用法

说明
mixed pathinfo ( string $path [, int $options ] )

pathinfo() 返回一个关联数组包含有 path 的信息。包括以下的数组单元:dirname,basename 和 extension。

可以通过参数 options 指定要返回哪些单元。它们包括:PATHINFO_DIRNAME,PATHINFO_BASENAME 和 PATHINFO_EXTENSION。默认是返回全部的单元。如果不是要求取得所有单元,则本函数返回字符串。

 Example #1 pathinfo() 例子

 代码如下 复制代码

<?php
$path_parts = pathinfo(“/www/htdocs/index.html”);
echo $path_parts["dirname"] . ” “;
echo $path_parts["basename"] . ” “;
echo $path_parts["extension"] . ” “;
?>

以上例程会输出:

/www/htdocs
index.html
htmlPHP parse_url 解析 URL,返回其组成部分
parse_url
(PHP 4, PHP 5)

parse_url — 解析 URL,返回其组成部分

说明
array parse_url ( string $url )本函数解析一个 URL 并返回一个关联数组,包含在 URL 中出现的各种组成部分。

本函数不是用来验证给定 URL 的合法性的,只是将其分解为下面列出的部分。不完整的 URL 也被接受,parse_url() 会尝试尽量正确地将其解析。

参数
 

url
要解析的 URL

 

返回值
对严重不合格的 URL,parse_url() 可能会返回 FALSE 并发出 E_WARNING。否则会返回一个关联数组,其组成部分为(至少有一个):

•scheme - 如 http
•host
•port
•user
•pass
•path
•query - 在问号 ? 之后
•fragment - 在散列符号 # 之后
 

范例
Example #1 parse_url() 例子

 代码如下 复制代码

<?php
$url = 'http://username:password@hostname/path?arg=value#anchor';

print_r(parse_url($url));
?>

以上例程会输出:

Array
(
    [scheme] => http
    [host] => hostname
    [user] => username
    [pass] => password
    [path] => /path
    [query] => arg=value
    [fragment] => anchor
)

注释
Note:

本函数不能用于相对 URL。

1

Ctype函数是Php的Ctype扩展函数提供了一组函数用于校验字符串中的字符是否是正确的格式,这篇文章我们主要介绍一下这些字符串验证函数的语法、有什么特殊的函数,如何去验证

Ctype函数是PHP内置的字符串体测函数。主要有以下几种

ctype_alnum -- Check for alphanumeric character(s)
检测是否是只包含[A-Za-z0-9]

ctype_alpha -- Check for alphabetic character(s)
检测是否是只包含[A-Za-z]


ctype_cntrl -- Check for control character(s)
检查是否是只包含类是“nrt”之类的字 符控制字符


ctype_digit -- Check for numeric character(s)
检查时候是只包含数字字符的字符串(0-9)


ctype_graph -- Check for any printable character(s) except space
检查是否是只包含有可以打印出来的字符(除了空格)的字符串


ctype_lower -- Check for lowercase character(s)
检查是否所有的字符都是英文字母,并且都是小写的


ctype_print -- Check for printable character(s)
检查是否是只包含有可以打印出来的字符的字符串


ctype_punct -- Check for any printable character which is not whitespace or an alphanumeric character
检查是否是只包含非数字/字符/空格的可打印出来的字符


ctype_space -- Check for whitespace character(s)
检查是否是只包含类是“ ”之类的字符和空格


ctype_upper -- Check for uppercase character(s)
检查是否所有的字符都是英文字母,并且都是大写的


ctype_xdigit -- Check for character(s) representing a hexadecimal digit
检查是否是16进制的字符串,只能包括 “0123456789abcdef”

如果使用他们

废话不多说直接上代码:

 代码如下 复制代码

<?php
$str1 = 'Azxc1234';//true
$str2 = '123#Axy';//false
if (ctype_alnum($string)) {
    echo "This string totally works";
}
else {
    echo "And this one not so much";
}

注意:如果传第一个空字符串,在php5.1之后是返回 false,但是早期的版本是返回true.

只要确保传递给函数的参数是一个字符串就不会有问题。

 代码如下 复制代码

<?php
$integer = 42;
ctype_digit($integer);         // false
ctype_digit((string)$integer); // true

结论

在使用PHP的过程中,同样的操作可能有不同的方法,选择一个合适的方法显然很重要。在PHP里判断字符串类型的函数有两类,ctype_*和 is_* 他们在实际的应用中 is_*这一系列的函数用的更多一些。当然除了这些办法我们还可以选择使用正则表达式来做判断,而且更强大,但是使用PHP内置的函数可以更好地减少出错率。

empty与isset在php中一个是为空,另一个判断是是否为一个存在的变量了,下面小编来给各位同学介绍php中empty与isset区别,欢迎各位同学进入参考。

empty是判断变量值是非空或非零的值。对应空定义包括:“”(空字符串)、0、“0”、NULL、FALSE、array()和$var(只声明但未赋值)。也就是说当变量值为上述这些,empty返回TRUE,其他的都返回FALSE。

isset是检测变量是否设置,并且不是 NULL。变量设置可以从几个方面来说。1:最简单的就是变量是否先声明和赋值;2:array中是否存在对应的index或key;3:object中是否存在对应的属性。

从上面的两个function定义可以看到,在某些情况下,两者可以公用,但其区别还是很大的。另外它们都只能检测变量,检测任何非变量的东西都将导致解析错误。例如直接检查另一个function的返回值(empty(otherFunction())),你将看到“Fatal error: Can’t use function return value in write context in”这样的错误。

另外isset可以一次检查多个变量,例如:isset($var1, $var2, $var3),当这三个值分别的isset都为TRUE结果为TRUE,否则结果为FALSE。

测试代码:

 代码如下 复制代码

$sep = "<br />";

echo 'test undeclared var empty : ';
var_dump(empty($var)); // TRUE
echo $sep . 'test undeclared var isset : ';
var_dump(isset($var)); // FALSE

$var;
echo $sep . 'test declared var but no set value empty : ';
var_dump(empty($var)); // TRUE
echo $sep . 'test declared var but no set value isset : ';
var_dump(isset($var)); // FALSE, 变量申明未赋值,默认值为NULL

$var = NULL;
echo $sep . 'test declared var and set value NULL empty : ';
var_dump(empty($var)); // TRUE
echo $sep . 'test declared var and set value NULL isset : ';
var_dump(isset($var)); // FALSE, 变量申明赋值为NULL

$var1 = ''; $var2 = '0'; $var3 = 0; $var4 = FALSE; $var5 = array();

echo $sep . 'test '' empty : ';
var_dump(empty($var1)); // TRUE
echo $sep . 'test '0' empty : ';
var_dump(empty($var2)); // TRUE
echo $sep . 'test 0 empty : ';
var_dump(empty($var3)); // TRUE
echo $sep . 'test FALSE empty : ';
var_dump(empty($var4)); // TRUE
echo $sep . 'test array() empty : ';
var_dump(empty($var5)); // TRUE
echo $sep . 'test '', '0', 0, FALSE, array() isset : ';
var_dump(isset($var1, $var2, $var3, $var4, $var5)); // TRUE,  变量申明并赋值为空字符串

输出的结果为:

 代码如下 复制代码

test undeclared var empty : bool(true)
test undeclared var isset : bool(false)
test declared var but no set value empty : bool(true)
test declared var but no set value isset : bool(false)
test declared var and set value NULL empty : bool(true)
test declared var and set value NULL isset : bool(false)
test '' empty : bool(true)
test '0' empty : bool(true)
test 0 empty : bool(true)
test FALSE empty : bool(true)
test array() empty : bool(true)
test '', '0', 0, FALSE, array() isset : bool(true)

比如检测 $id 变量,当 $id=0 时,用empty() 和 isset() 来检测变量 $id 是否已经配置,两都将返回不同的值—— empty() 认为没有配置,isset() 能够取得 $id 的值:

 代码如下 复制代码

 $id=0;
    empty($id)?print "It's empty .":print "It's $id .";
      //结果:It's empty .
    print "<br>";
    !isset($id)?print "It's empty .":print "It's $id .";
      //结果:It's 0 .

   这意味着,我们在使用变量处理函数时,当该变量可能出现0的值,使用 empty() 要小心,这个时候用 isset 取代它更明智一些。

当一个php页面的 URL 尾部参数出现 id=0 时(比如:test.php?id=0),试比较:

 代码如下 复制代码

if(empty($id)) $id=1; - 若 id=0 ,id 也会为1
if(!isset($id)) $id=1; - 若 id=0 ,id 不会为1

可分开运行以下代码检测上述推断:

 代码如下 复制代码

 if(empty($id)) $id=1;
    print $id; // 得到 1

    if(!isset($id)) $id=1;
    print $id; //得到 0

php 中遍历一个array时可以使用for或foreach,foreach的语法为:foreach ($arr as $k => $v)。遍历数组,把index赋给$k,数组的值赋给$v,那么此处的赋值是传值还是传引用呢。

php中foreach()的用法

foreach()有两种用法:

1:

 代码如下 复制代码
foreach(array_name as $value)
   {
      statement;
   }

这里的array_name是你要遍历的数组名,每次循环中,array_name数组的当前元素的值被赋给$value,并且数组内部的下标向下移一步,也就是下次循环回得到下一个元素。
 
2:

 代码如下 复制代码
foreach(array_name as $key => $value)
   {
       statement;
    }

这里跟第一种方法的区别就是多了个$key,也就是除了把当前元素的值赋给$value外,当前元素的键值也会在每次循环中被赋给变量$key。键值可以是下标值,也可以是字符串。比如book[0]=1中的“0”,book[id]="001"中的“id”.

看下面的例子:

 代码如下 复制代码

$arr = array(
    array('id' => 1, 'name' => 'name1'),
    array('id' => 2, 'name' => 'name2'),
);

foreach ($arr as $obj) {
    $obj['id'] = $obj['id'];
    $obj['name'] = $obj['name'] . '-modify';
}

print_r($arr); //输出的结果
Array(
    [0] => Array (
        [id] => 1
        [name] => name1
    )
    [1] => Array(
        [id] => 2
        [name] => name2
    )
)

观察可以发现在foreach循环中对$arr操作并没有影响到$arr的元素,所以这里的赋值是传值而不是传引用。那如果需要修改$arr中元素的值该怎么办呢?可以在变量前面加一个”&”符号,例如:

 代码如下 复制代码

foreach ($arr as &$obj) {
    $obj['id'] = $obj['id'];
    $obj['name'] = $obj['name'] . '-modify';
}

再看另外一个例子,array里面存放的是object,

 代码如下 复制代码

$arr = array(
    (object)(array('id' => 1, 'name' => 'name1')),
    (object)(array('id' => 2, 'name' => 'name2')),
);

foreach ($arr as $obj) {
    $obj->name = $obj->name  . '-modify';
}

print_r($arr); //输出的结果

Array
(
    [0] => stdClass Object
        (
            [id] => 1
            [name] => name1-modify
        )

    [1] => stdClass Object
        (
            [id] => 2
            [name] => name2-modify
        )

)

此时可以看到原始数组中的object对象已经修改了,所以这里的赋值又是传引用而不是传值

综合上述,得出的结论:如果数组里面存放的是普通类型的元素就是采用传值的方式,存放对象类型元素采用的方式为传地址。

[!--infotagslink--]

相关文章

  • php中eval()函数操作数组的方法

    在php中eval是一个函数并且不能直接禁用了,但eval函数又相当的危险了经常会出现一些问题了,今天我们就一起来看看eval函数对数组的操作 例子, <?php $data="array...2016-11-25
  • php 中file_get_contents超时问题的解决方法

    file_get_contents超时我知道最多的原因就是你机器访问远程机器过慢,导致php脚本超时了,但也有其它很多原因,下面我来总结file_get_contents超时问题的解决方法总结。...2016-11-25
  • php抓取网站图片并保存的实现方法

    php如何实现抓取网页图片,相较于手动的粘贴复制,使用小程序要方便快捷多了,喜欢编程的人总会喜欢制作一些简单有用的小软件,最近就参考了网上一个php抓取图片代码,封装了一个php远程抓取图片的类,测试了一下,效果还不错分享...2015-10-30
  • Python 图片转数组,二进制互转操作

    这篇文章主要介绍了Python 图片转数组,二进制互转操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-09
  • HTTP 408错误是什么 HTTP 408错误解决方法

    相信很多站长都遇到过这样一个问题,访问页面时出现408错误,下面一聚教程网将为大家介绍408错误出现的原因以及408错误的解决办法。 HTTP 408错误出现原因: HTT...2017-01-22
  • Android子控件超出父控件的范围显示出来方法

    下面我们来看一篇关于Android子控件超出父控件的范围显示出来方法,希望这篇文章能够帮助到各位朋友,有碰到此问题的朋友可以进来看看哦。 <RelativeLayout xmlns:an...2016-10-02
  • ps把文字背景变透明的操作方法

    ps软件是现在非常受大家喜欢的一款软件,有着非常不错的使用功能。这次文章就给大家介绍下ps把文字背景变透明的操作方法,喜欢的一起来看看。 1、使用Photoshop软件...2017-07-06
  • php数组操作 键名比较 差集 交集赋值

    本文章提供在量的数据中级操作实例有如对键名比较计算数组的差集 计算差集 给指定数组中插入一个元素 反转数组 交集赋值新的数组实例。 //定义回调函数 funct...2016-11-25
  • intellij idea快速查看当前类中的所有方法(推荐)

    这篇文章主要介绍了intellij idea快速查看当前类中的所有方法,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2020-09-02
  • C#二维数组基本用法实例

    这篇文章主要介绍了C#二维数组基本用法,以实例形式分析了C#中二维数组的定义、初始化、遍历及打印等用法,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25
  • Mysql select语句设置默认值的方法

    1.在没有设置默认值的情况下: 复制代码 代码如下:SELECT userinfo.id, user_name, role, adm_regionid, region_name , create_timeFROM userinfoLEFT JOIN region ON userinfo.adm_regionid = region.id 结果:...2014-05-31
  • js导出table数据到excel即导出为EXCEL文档的方法

    复制代码 代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta ht...2013-10-13
  • php curl模拟post请求和提交多维数组的示例代码

    下面一段代码给大家介绍php curl模拟post请求的示例代码,具体代码如下: <&#63;php$uri = "http://www.cnblogs.com/test.php";//这里换成自己的服务器的地址// 参数数组$data = array ( 'name' => 'tanteng'// 'passwor...2015-11-24
  • C#数组的常用操作方法小结

    Array数组在C#中同样是最基本的数据结构,下面为大家C#数组的常用操作方法小结,皆为细小的代码段,欢迎收看收藏...2020-06-25
  • mysql 批量更新与批量更新多条记录的不同值实现方法

    批量更新mysql更新语句很简单,更新一条数据的某个字段,一般这样写:复制代码 代码如下:UPDATE mytable SET myfield = 'value' WHERE other_field = 'other_value';如果更新同一字段为同一个值,mysql也很简单,修改下where即...2013-10-04
  • ps怎么制作倒影 ps设计倒影的方法

    ps软件是一款非常不错的图片处理软件,有着非常不错的使用效果。这次文章要给大家介绍的是ps怎么制作倒影,一起来看看设计倒影的方法。 用ps怎么做倒影最终效果&#819...2017-07-06
  • js基础知识(公有方法、私有方法、特权方法)

    本文涉及的主题虽然很基础,在许多人看来属于小伎俩,但在JavaScript基础知识中属于一个综合性的话题。这里会涉及到对象属性的封装、原型、构造函数、闭包以及立即执行表达式等知识。公有方法 公有方法就是能被外部访问...2015-11-08
  • 安卓手机wifi打不开修复教程,安卓手机wifi打不开解决方法

    手机wifi打不开?让小编来告诉你如何解决。还不知道的朋友快来看看。 手机wifi是现在生活中最常用的手机功能,但是遇到手机wifi打不开的情况该怎么办呢?如果手机wifi...2016-12-21
  • PHP 验证码不显示只有一个小红叉的解决方法

    最近想自学PHP ,做了个验证码,但不知道怎么搞的,总出现一个如下图的小红叉,但验证码就是显示不出来,原因如下 未修改之前,出现如下错误; (1)修改步骤如下,原因如下,原因是apache权限没开, (2)点击打开php.int., 搜索extension=ph...2013-10-04
  • c#中分割字符串的几种方法

    单个字符分割 string s="abcdeabcdeabcde"; string[] sArray=s.Split('c'); foreach(string i in sArray) Console.WriteLine(i.ToString()); 输出下面的结果: ab de...2020-06-25