PHP经典实例学习笔记--数组

本文介绍PHP中数组的各种操作方法,包括定义、初始化、遍历、排序等,帮助开发者更好地理解和运用数组。

1、数组定义和基本使用

  • 在数值数组中,索引为数字,下标从0开始,每次增加1。
  • 关联数组(散列、映射或字典)。索引不是整数,而是字符串。
  • 在PHP中,同时支持两种,数值数组就是关联数组,关联数组就是数值数组。
//建立索引数组的四种方式
$fruits = array('apple','banana','cantaloupe');

$fruits[0] = 'apple';
$fruits[1] = 'banana';
$fruits[2] = 'cantaloupe';

$fruits[] = 'apple';    //为数组添加元素,自动分别索引
$fruits[] = 'banana';
$fruits[] = 'cantaloupe';

$fruits=['apple','banana','cantaloupe'];

//建立关联数组的三种方式
$fruits = array('red'=>'apple','yellow'=>'banana','beige'=>'cantaloupe');

$fruits['red'] = 'apple';
$fruits['yellow'] = 'banana';
$fruits['beige'] = 'cantaloupe';

$fruits=['red'=>'apple','yellow'=>'banana','beige'=>'cantaloupe'];

//要循环遍历一个数组,并处理其中所有后部分元素,最简单的部分就是使用foreach
foreach($fruits as $color => $fruit)
//$color表示key,$fruit表示value

//可以使用list将数组分解为单个变量
list($red,$yellow,$beige) = $fruits;


2、指定并非从元素0开始的数组

问题

希望一步为一个数组赋值多个元素,不过不希望第一个元素的索引为0

解决方案

使用=>语法指示array()使用一个不同的索引。

//使用这种方式,第一个下标为1,后面的下标依次为2、3、4
$presidents = array(1=>'Washington','Adams','Jefferson','Madison');

//可以在一个调用中多次使用=>,也可以在数值数组和关联数组混合使用
$presidents = array(5=>'Washington','Hosnest'=>'Lincoln','Adams',12=>'Jefferson','Madison');
//Adams的下标为6,Madison的下标为13

//输出

扩展:array() 的有关文档http://www.php.net/array


3、数组中每个键存储多个元素

问题

希望一个键与多个元素关联。

解决方案

将多个元素存储在一个数组中。

//数组方式
$fruits = array('red'=>array('apple','cherry'),'yellow'=>'banana');
//对象方式
while($obj = mysqli_fetch_assoc($r)){
    $fruits[] = $obj;
}

//使用匿名的二维数组
$fruits = array();
$fruits['red'][]='apple';
$fruits['red'][]='cherry';
//输出

扩展:array() 的有关文档http://www.php.net/array


4、数组初始化为一个整数范围

问题

希望将一系列脸上的整数赋值给一个数组。

解决方案

使用range($start,$end,$step)

//函数原型array range(mixed $start,mixed $limit[,number $step=1])
//包含开始和结束
print range(1,10,2)

//输出
[1,3,5,7,9]

扩展:range() 的有关文档http://www.php.net/range


5、迭代处理数组

问题

希望循环遍历一个数组,处理其中所有或部分元素。

解决方案

可以使用foreach

//第一种,foreach简洁,迭代处理的是数组的一个副本,而不是本身
foreach($array as $value){}
//第二种
foreach($array as $key=>$value){}
//第三种,for和each都是处理数组本身,不安全,容易修改数组
for($key=0,$size=count($array);$key<$size;$key++){}
//第四种,结合list,while,each和reset
reset($array);
while(list($key,$value)=each($array)){}
//each一定要reset,否则头指针不能指向第一个元素,下次会出错。

//可以使用array_map(),把各个元素交给一个函数来处理
//函数原型 array array_map ( callable $callback , array $arr1)
$lc = array_map('strtolower',$words);
//使用array_map之前需要确保,$words是一个数组,用is_array()函数判断

//输出

扩展:foreach() 的有关文档http://www.php.net/foreach


6、从数组删除元素

问题

希望从一个数组中删除一个或多个元素。

解决方案

要删除一个元素,可以使用unset

/*删除一个元素,这个元素所占内存变为未分配,但是下标依然保留,相当于一个未定义的数组元素。*/
unset($array[3]);

//删除多个元素
array_splice($array,$offset,$length);

/*使用unset删除元素之后,PHP会调整数组,是循环仍然能正确工作。但是不会压缩数组,空位置依然保留,可以使用array_values()来压缩数组*/

$animals = array_values($animals);
array_splice($animals,2,3);                 //二者都会从新建立索引

array_push()        //数组最后插入一个数值
array_pop()         //数组最后删除一个数值
array_shift()       //数组最前删除一个数值
array_unshift()     //数组最前插入一个数值

//输出

扩展:unset() 的有关文档http://www.php.net/unset


7、改变数组大小

问题

希望改变一个数组的大小,使其大于或小于目前的大小。

解决方案

使用array_pad() 来扩展数组,array_splice() 来压缩数组。

//函数原型 array_pad (array $input,int $pad_size,mixed $pad_value)
//第一参数是要填充的数组,第二个参数是大小和方向,第三个填充值
//-5表示向左填充,填充一共到5个元素,而不是填充5个元素
$array = array('apple','banana','coconut');
$array = array_pad($array,-5,'hello');

//函数原型 array_splice($array,$start,$length)
//通过array_splice来删除元素,$start可以是负数
$array = array_splice($array,-1);
$array = array_splice($array,2,2);


//输出
['hello','hello','apple','banana','coconut']
['hello','hello','apple','banana']
['hello','hello']

扩展:array_splice() 的有关文档http://www.php.net/array_splice


8、将数组追加到另一个数组

问题

希望把两个数组合并成一个数组。

解决方案

使用array_merge() 来合并数组。

//函数原型 array array_merge ( array $array1 [, array $... ] )
$p_languages = array('Perl','PHP');
$p_languages = array_merge($p_languages,array('Python'));

//合并时数值键会从新编号,字符串键重复的会覆盖
$lc = array('a','b'=>'B');
$wc = array('A','b'=>'C');
$ac = array_merge($lc,$wc);
print_r($ac);

//+操作符也可以用来合并数组,但是不会从新排序避免冲突
$lc = array('a','b'=>'B');
$wc = array('A','b'=>'C');
$ac = $lc + $wc;
print_r($ac);

//输出
['Perl','PHP','Python']
Array
(   
    [0] => a
    [b] => C
    [1] => A
)
Array
(   
    [0] => a
    [b] => B
)

扩展:array_merge() 的有关文档http://www.php.net/array_merge


9、将数组转换为字符串

问题

希望一个数组转换为一个格式化字符串。

解决方案

使用implode() 连接数组 别名叫join()。还可以使用循环处理。

//函数原型 string implode ( string $glue , array $pieces )
//特点循环速度快,但是implode()无法区分值,只在元素之间放分隔符,不能两边放
$string = implode(',',$array);

//有时需要数组的一个子集而不是全部
$string = '';
foreach($fields as $key =>$value){
    if('password'!=$key){
        $string.=",<b>$value</b>";
    }
}
//需要通过substr来删除第一个逗号,系统函数调用比较快,这种方式比较好
$string = substr($string,1);
//输出
Perl,PHP,Python

扩展:implode() 的有关文档http://www.php.net/implode


10、检查一个键或值是否在数组中

问题

希望知道一个数组中是否包含某个键或者值。

解决方案

使用array_key_exists()in_array()

//函数原型 bool array_key_exists ( mixed $key , array $search )
//与isset相比能判断一个为值为空的键是否存在
if(array_key_exists('key',$array))
if(isset($array['key']))

//函数原型in_array(mixed $value,array $search[,bool $strict=FALSE])
//默认情况下进行的是==比较,不能比较两种数据的类型,只比较数值大小

$array = array(1,'2','three');
in_array(0,$array);        //three转换为数字值为0,所以为true
in_array(0,$array,true);   //数字与字符串的比较需要严格比较,才安全
in_array(1,$array);
in_array(1,$array,true);
in_array(2,$array);
in_array(2,$array,true);

//输出
true
false
true
true
true
false

扩展:in_array() 的有关文档http://www.php.net/in_array


11、查找一个值在数组中的位置

问题

希望知道一个值是否在数组中,如果这个值在数组中,希望知道他的键。

解决方案

使用array_search()

//函数原型 array_search($value,array $search[,bool $strict=false])
//如果找到value,则返回他的键,否则返回false
$key = array_search($value,$array);
if($key!==false){}

//array_search需要使用!==false来检查。与in_array相比,性能基本没有差异。但是array_search的返回信息非常有用,所以推荐使用array_seach()

//输出

扩展:array_search() 的有关文档http://www.php.net/array_search


12、数组最大值,最小值,求和,以及数组反转

问题

希望找到一个数组中最大值,最小值,数组总和,以及数组反转。

解决方案

使用max(),min(),array_sum(),array_reverse()

$array = array(1,2,3,4,5);
print max($array);
print min($array);
print array_sum($array);
//array_reverse的开销比较大,一般需要避免这种操作
print array_reverse($array);

//输出
5
1
15
[5,4,3,2,1]

扩展:max() 的有关文档http://www.php.net/max


13、数组排序

问题

希望以特定的方式对数组排序。

解决方案

使用asort(),arsort(),sort(),usort(),uasort(),uarsort()

//asort(),arsort(),uarsort(),uasort(),可以保持索引与键之间的关系
//sort(),usort(),不能保持索引与值之间的关系。默认是升序排序
$fruits = array("d" => "lemon", "a" => "orange", "b" => "banana", "c" => "apple");
$array = array(1,4,3,2,5);
sort($array,SORT_NUMBRIC);
asort($fruits);
//用户自定义函数进行排序,但是usort排序的速度非常慢,不建议使用
uasort($fruits,function($a,$b){
    return strnatcmp($a,$b);
});

//输出
[1,2,3,4,5]
['a' => apple,'b' => banana,'d' => lemon,'o' => orange]
['a' => apple,'b' => banana,'d' => lemon,'o' => orange]

扩展:sort() 的有关文档http://www.php.net/sort


14、随机调整数组以及删除数组中重复的元素

问题

希望随机的重新为数组中的元素排序,删除一些重复的元素。

解决方案

使用shuffle(),array_unique()

//函数原型 bool shuffle ( array &$array )
$array = range(1,6);
shuffle($array);

//函数原型 array_unique(array $array[,int $sort_flags=SORT_STRING])
$array = array('apple','banana','apple','lemon');
array_unique($array); //删除重复元素的最佳方法


//输出
[1,3,4,6,2,5]
['apple','banana','lemon']

扩展:shuffle() 的有关文档http://www.php.net/shuffle

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值