数组函数 compact() extract() in_array()

数组函数实在是太多了,学习起来也比较绕,很难把其深刻的掌握啊,不过只要多加练习,第一映像应该还是有的,所以还是多练习才能理解和熟练的应用这些函数。

在实际的代码编写中,我们有时需要把变量转化为数组,那么在PHP系统里就为我们提供了这样的函数,这节就讲到把变量转化为数组的函数:

1、 compact(参数1,参数2,参数…) 将一个或多个变量转化为数组,变量名为数组的键名,变量值为数组的键值,可以接收传入两种不同的参数:1.直接传入变量名的方式;2.传入以变量名为数组的传入方式,此方式就像我们经常看到的把要定义的变量存放在一个配置文件里,然后通过数组将其传入。

实例分析:

第一种传入的变量方式实例:

function fun($arr){

echo'

';

print_r($arr);

} //自定义一个格式化函数来输出新生成的数组。

$blogname='php学习日志';

$blogurl='www.www.www';

$class='php视频教程';

$news_arr=compact('blogname','blogurl','class');

fun ($news_arr);

输出结果:

Array ( [blogname] => php学习日志 [blogurl] => www.www.www [class] => php视频教程 )

从输出的结果看到,我们所定义的三个变量( $blogname $blogurl $class)经过compact函数处理后,以变量作为数组的键名,变量值作为数组的键值形式生成一数组,compact函数里的变量参数名要和定义的变量相同,否则无法生成数组。

第二种传入数组方式实例:

function fun($arr){

echo'';

print_r($arr);

}

$blogname='php学习日志';

$blogurl='www.www.www';

$class='php视频教程';

$arr1=array('blogname','blogurl','class'); //定义一个数组。

$arr2=compact($arr1);

fun($arr2);

输出结果:

Array ( [blogname] => php学习日志 [blogurl] => www.www.www [class] => php视频教程 )

从输出的结果可以看到,不论是以数组方式传入变量,还是直接传入变量,在例子中得到的结果是一样的。而第二种传入方式是我们经常用到的写在一个配置文件里的变量,然后include等其它方式传入进来等等,的一些使用场合。

这就是compact()函数的使用过程,基本上也比较简单,使用起来也方便,很好记忆。。

接下来再看compact()函数的反函数,既然compact()函数能把变量生成数组,那么也会有把数组转化成变量的函数,那么这个能把数组转化成变量的函数就是extract()函数,extract()函数有多个系统的参数,这些系统的参数都有其用途,接下来看其使用说明与实例。

2、extract($var_array,EXTR_OVERWRITE<这个参数是默认参数>)把数组转化成变量,数组的键名是变量的变量名,数组的键值是变量的值,函数处理成功后返回值是int类型的数字(即:经过extract函数处理后生成多少个变量)。

经常用到的系统参数:

(1).EXTR_IF_EXISTS //当extract函数发现有同名变量存在,则生成该变量,其他不存在的就不生成了

(2).EXTR_OVERWRITE //该参数是extract函数的默认参数,即:覆盖掉有出现同名的变量。

(3).EXTR_PREFIX_ALL //在所有生成的变量前面加前辍,使用该参数时要同时给有字母的变量前辍内容

(4).EXTR_PREFIX_IF_EXISTS //假如要生成的变量名已经存在,那么就给生成的这个变量加前辍,其他不存在的变量(也就是没有另外定义过的同名变量名)既不生成也不添加前辍。

(5).EXTR_PREFIX_INVALID //当转化数组元素为变量时,碰到有索引数组元素时,就在前面加前辍。

(6).EXTR_PREFIX_SAME //当生成的数组变量时,碰到有已经定义过的变量名就加上前辍,没有定义过就不加前辍,同时在这个要转化为变量的数组里如果有索引数组元素在里面时这个变量不生成。

(7).EXTR_REFS //这是一个传值引用操作的参数,当变量名的值发生改变时,原变量的值也发生改变。

(8).EXTR_SKIP //当extract函数发现有同名变量存在时,extract函数就不再生成该同名的变量。

从默认参数开始一一举例说明,正因为是默认参数,所以可以不用写这EXTR_OVERWRITE参数出来:

例子1默认参数(EXTR_OVERWRITE):

$blogname='参加学习吧'; //由于该(EXTR_OVERWRITE)参数的功能是:覆盖掉有出现同名的变量。所以就故意定义一个和以下数组元素中相同的变量名。

$arr1=array('blogname'=>'php学习日志','blogurl'=>'www.www.www','class'=>'php视频教程');

var_dump(extract($arr1,EXTR_OVERWRITE<该参数为默认可以不填写>)); //函数返回的是int类型数据,即生成多少个变量,在这个例子一共生成3个变量,所以得到的值为:int(3) 。

echo $blogname; //经过extract函数处理后,我们输出变量$blogname时结果发现输出的是我们定义数组里:$arr1里的以'blogname'为键名的数组元素值:'php学习日志'。

例子的输出结果:int(3) 表示成功生成3个变量。

echo $blogname;输出结果:php学习日志,用来测试EXTR_OVERWRITE参数的覆盖效果,我们在做实际项目时,有可能经过include包涵过来的文件,有可能存在变量的同名,如果我们不希望有同名出现就可以覆盖掉。

例子2参数(EXTR_SKIP):当extract函数发现有同名变量存在时,extract函数就不再生成该同名的变量。

$blogname='参加学习吧';

$arr1=array('blogname'=>'php学习日志','blogurl'=>'www.www.www','class'=>'php视频教程');

var_dump(extract($arr1,EXTR_SKIP));

echo $blogname;

输出结果: int(2) 参加学习吧

从输出的结果看到,extract函数只为我们生成2个变量,而变量$blogname并没有生成,那是因为EXTR_SKIP参数的影响原因,跳过这人同名变量的生成,去生成其他没有同名变量的变量。

例子3参数(EXTR_IF_EXISTS):

$blogname='参加学习吧';

$arr1=array('blogname'=>'php学习日志','blogurl'=>'www.www.www','class'=>'php视频教程');

var_dump(extract($arr1,EXTR_IF_EXISTS));

echo $blogname;

输出结果:int(1) php学习日志

从输出的结果看到,extract函数只为我们生成1个变量,因为使用了EXTR_IF_EXISTS参数,此参数的意思就是:当发现有同名变量存在,则生成该变量,其他不存在的就不生成了,所以看到extract函数只为我们生成1个变量了。

例子4参数(EXTR_PREFIX_ALL)需要给前辍的以字母开头的内容:

$blogname='参加学习吧';

$arr1=array('blogname'=>'php学习日志','blogurl'=>'www.www.www','class'=>'php视频教程','JSP课程'); //这个数组里我们故意添加一个不加关联键名的索引数组元素,看看以下的输出效果。

var_dump(extract($arr1,EXTR_PREFIX_ALL,'hzm'));//这里给出变量名的前辍“hzm”

echo $blogname;

输出结果:“int(4) 参加学习吧” 从输出的结果看到,extract函数为我们生成了4个变量,最后的一个数组元素我们没有给键名,所以它的键名是以索引的“0”作为这个元素的键名(从变量的定义规则来讲,变量只能由字母、下划线开头来定义的,所以假如我们定义的数组里有索引数组的话,就需要给它加上变量名前辍了,这也很好理解,就像一些CMS、论坛程序等都要求我们给数据库表添加前辍,就是防止有同名表存在而被覆盖的危险。所以在这个例子里需要使用这个索引变量就加上我们定义的前辍'hzm':echo $hzm_0;这样就可以正确的输出:“'JSP课程”这个索引数组元素值了;同时由于EXTR_PREFIX_ALL参数是给通过数组生成的每一个数组元素的变量名键名前都加上了前辍字符,所以上面我们的这个echo $blogname;输出语句就只能输出前面自己定义的:$blogname='参加学习吧';的变量值“参加学习吧”了,而如果需要输出数组里的元素那就得加上变量的前辍:echo $hzm_blogname;这样输出的结果就是:'php学习日志'这个元素值了)。

例子5参数(EXTR_PREFIX_IF_EXISTS):假如要从数组里生成出来的变量名已经存在,那么就给生成的这个变量加前辍,其他不存在的变量(也就是说没有另外定义过的同名变量名)它既不生成也不添加前辍,原来定义过的同名变量仍然存在。

$blogname='参加学习吧';

$arr1=array('blogname'=>'php学习日志','blogurl'=>'www.www.www','class'=>'php视频教程','JSP课程');

var_dump(extract($arr1,EXTR_PREFIX_IF_EXISTS,'hzm'));

echo $hzm_blogname;

输出结果:“int(1) php学习日志”。从输出的结果看出,extract函数使用EXTR_PREFIX_IF_EXISTS参数它只为我们生成一同名的变量并给这个变量加上前辍。

注:使用加前辍的EXTR_PREFIX_ALL、EXTR_PREFIX_IF_EXISTS参数时,如果数组元素里自己存在相同的键名的话,当然再前辍也是一样同名,这样输出的结果会是只输出最后出现的那个数组元素值,这也就符合在同一时刻同名的变量名只能存在一次的说法了。

例子6参数(EXTR_PREFIX_INVALID):当转化数组元素为变量时,碰到有索引数组元素时,就在前面加前辍。同时为我们生成其他不索引数组元素的变量。

$blogname='参加学习吧';

$arr1=array('blogname'=>'php学习日志','blogurl'=>'www.www.www','class'=>'php视频教程','JSP课程');

var_dump(extract($arr1,EXTR_PREFIX_INVALID,'hzm'));

echo $hzm_0;

输出结果:“int(4) JSP课程”,从输出结果可知道,extract函数在使用EXTR_PREFIX_INVALID参数时,为我们生成了4个变量,其中有个索引数组元素也给我们生成出来,并在这个索引数组元素键名前加了前辍hzm来改变变量名前不能使用数字开头的规则。

例子7参数(EXTR_PREFIX_SAME):当生成的数组变量时,碰到有已经定义过的变量名就加上前辍,没有定义过就不加前辍,同时在这个要转化为变量的数组里如果有索引数组元素在里面时这个变量不生成。

$blogname='参加学习吧';

$arr1=array('blogname'=>'php学习日志','blogurl'=>'www.www.www','class'=>'php视频教程','JSP课程');

var_dump(extract($arr1,EXTR_PREFIX_SAME,'hzm'));

echo $hzm_blogname;

输出结果:“int(3) php学习日志”,从输出的结果看出,extract函数在使用EXTR_PREFIX_SAME参数时只为我们生成了3个变量(并给生成出来的同名变量加上前辍),而在数组$arr1里我们定义有4个元素,有一个是索引元素,这个索引元素没有被生成变量。这就说明EXTR_PREFIX_SAME参数只能使用于关联数组,同时也可以从则面反映了变量名不能使用数字开头的规则,在命名变量时我们不能也不可能使用数字开头。

例子8参数(EXTR_REFS):这是一个传值引用操作的参数,当变量名的值发生改变时,原变量的值也发生改变

先来看看没有改变变量中的值时的情况:

$arr1=array('blogname'=>'php学习日志','blogurl'=>'www.www.www','class'=>'php视频教程','JSP课程');

var_dump(extract($arr1,EXTR_REFS));

echo $blogname;

输出结果:“int(3) php学习日志”,从输出的结果看,只为我们生成了3个变量,数组$arr1里有个索引元素没有被生成变量,原因和前面的参数一样。现在我们看不出extract函数使用EXTR_REFS参数后的效果。现在我们来做一点小修改:

$arr1=array('blogname'=>'php学习日志','blogurl'=>'www.www.www','class'=>'php视频教程','JSP课程');

var_dump(extract($arr1,EXTR_REFS));

echo $blogname;

$arr1['blogname']='php学习日志是尽可能的写下最详细的日志出来,帮助更多朋友一起学习php。';

echo ''.$blogname;

输出结果:“int(3) php学习日志”“php学习日志是尽可能的写下最详细的日志出来,帮助更多朋友一起学习php。”从输出的结果可以看到,和前面我们学到的传值引用是一样的道理,也就是通过这条{$arr1['blogname']='php学习日志是尽可能的写下最详细的日志出来,帮助更多朋友一起学习php。';

}语句改变原来的数组中元素值,原来的变量值也就跟着改变了,因为这两变量$blogname引用的是同一个内存地址里的值,只要值发生改变了,变量值也就一起改变。从这个例子来讲,虽然我们生成了一个变量:$blogname,这个变量里所存储的值就是数组'blogname'=>“'php学习日志'”,的值,数组元素'blogname'存在内存中的某一个位置,只不过呢我们通过extract函数使用EXTR_REFS参数生成的新变量$blogname所存储的值是引用数组$arr1['blogname']里的元素blogname变量的值即:同一个值:'php学习日志',只不过这里$arr1['blogname']是原'blogname'=>'php学习日志'变量的别名。这就是引用传值的概念,通过这个概念,我们可以得到,当我原数组的值发生更改时,新生成的变量值也随之更改。呵呵,这里非常的绕啊。但多做练习应该没有问题。

3、in_array('需要查找的字符串','想要查找的数组变量名',TRUE/FALSE)查找指定的内容是否存在于数组当中,如果存在返回布尔“真”,不存在返回布尔“假”,如果加上第三参数TRUE/FALSE时严格对数据类型进行匹配。

这个函数我们在前面也已经说到过了,这里再次温习一下它吧:

实例:

$arr1=array('1','CSS课程','PHP教程');

if(in_array('css',$arr1)){

echo '该字符存在数组中';

}else{

echo '该字符不存在数组中';

}

输出结果:该字符不存在数组中,通过输出结果看到,in_array函数使用也非常的简单,但需要注意的是该函数的第三个参数,当第三个参数为TRUE时对数据类型进行严格的判断,只有数据类型都一样才会返回“真”,否则返回“假”。

或者我们可以直接写个三言表达式:

$arr1=array('1','CSS课程','PHP教程');

$on=in_array(1,$arr1)?'该字符存在数组中':'该字符不存在数组中';//使用三言表达式更直观

echo $on;

http://www.123pww.com/index/html_2/%E8%8C%82%E5%90%8D%E5%B8%82/440900

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值