数组是对大量数据进行有效组织和管理的手段之一,通过数组的强大功能,可以对大量性质相同的数据进行存储、排序、插入及删除等操作,从而可以有效地提高程序开发效率及改善程序的编写方式。
数组:是一组有序成员(键值对)的集合
// 索引数组:键是从0开始递增的正整数
$arr = [a,b,c,d];
// 除了中括号声明数组也可以用array
$arr1 = array(11,22,33,44);
echo "<pre>";
print_r($arr);
print_r($arr1);
// 索引数组访问
echo $arr[0],$arr[2];
// 更新数组
$arr[3] = 666;
echo "<hr>";
// -----------------------
// 关联数组:键是“语义化”字符串 如:id uname email
$user = ['id'=>1,"email"=>'2602138376@qq.com','uname'=>'zhang'];
echo "<pre>";
print_r($user);
echo user['uname']; // zhang
// 我们也可以直接赋值时创建
$info['name'] = 'zhang';
var_dump($info);
二维数组和多维数组
// 二维数组 数组中含有数组 [[],[],[]]
$arr = [
['username'=>'zhang','email'=>'1568@qq.com'],
['username'=>'admin','email'=>'admin@qq.com'],
['username'=>'shuai','email'=>'26021@qq.com']
];
echo "<pre>";
print_r($arr);
// 访问二维数组
echo $arr[1]['uname']; // admin
// 使用foreach遍历二维数组中每一项
foreach($arr as $k=>$v){
echo $v["uname"].$v["email"]."<br>";
}
// foreach 遍历对象
$obj = new class{
public $name = 'admin';
public $email = 'admin@php.com';
public $gender = true;
};
foreach($obj as $key=>$value){
printf("[%s => %s] <br>",$key,$value);
}
range() :https://www.php.net/manual/zh/function.range.php
// range(开始值,结束值,步长)
// 快速生成1-10的数组
$arr1 = range(1,10);
print_r($arr1);
/* Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 [4] => 5 [5] => 6 [6] => 7 [7] => 8 [8] => 9 [9] => 10 )*/
// step 参数 每次增加的步长
// 生成0 10 20 30 到10的数组
$arr2 = range(0, 100, 10);
print_r($arr2);
/*Array ( [0] => 0 [1] => 10 [2] => 20 [3] => 30 [4] => 40 [5] => 50 [6] => 60 [7] => 70 [8] => 80 [9] => 90 [10] => 100 )*/
// 也可以生成字母a到i
$arr3 = range('a', 'i');
print_r($arr3);
/* Array ( [0] => a [1] => b [2] => c [3] => d [4] => e [5] => f [6] => g [7] => h [8] => i )*/
echo implode("",range("6 ","Q")); //space after the 9
// prints 6789:;<=>?@ABCDEFGHIJKLMNOPQ
array_unshift:https://www.php.net/manual/zh/function.array-unshift.php
array_push:https://www.php.net/manual/zh/function.array-push.php
$arr = [22,33,44,55];
// array_unshift() 在数组头部添加元素
array_unshift($arr,11);
// array_push() 在数组尾部添加元素
array_push($arr,66);
print_r($arr);
/* Array ( [0] => 11 [1] => 22 [2] => 33 [3] => 44 [4] => 55 [5] => 66 )*/
array_shift:https://www.php.net/manual/zh/function.array-shift.php
array_pop:https://www.php.net/manual/zh/function.array-pop.php
array_slice:https://www.php.net/manual/zh/function.array-splice.php
$arr = range(a,g);
// 删除头部数组元素
print_r($arr);
/* Array ( [0] => a [1] => b [2] => c [3] => d [4] => e [5] => f [6] => g )*/
// 删除头部元素a 返回删除的数组元素
echo array_shift($arr); // a
print_r($arr);
/* Array ( [0] => b [1] => c [2] => d [3] => e [4] => f [5] => g )*/
// 删除尾部数组元素
echo array_pop($arr); // g
print_r($arr);
/* Array ( [0] => b [1] => c [2] => d [3] => e [4] => f ) */
// array_splice 去掉数组中的某一部分并用其它值取代
// 一个参数的时候 从当前位置删除到最后
$input = array("red", "green", "blue", "yellow");
array_splice($input, 2);
var_dump($input);
/* array(2) { [0]=> string(3) "red" [1]=> string(5) "green" } */
// 两个参数,删除从开始位置到结束位置的元素
$input = array("red", "green", "blue", "yellow");
array_splice($input, 1, 2);
var_dump($input);
/* array(2) { [0]=> string(3) "red" [1]=> string(6) "yellow" } */
// 三个参数,将开始位置和结束位置的元素替换为指定元素
$input = array("red", "green", "blue", "yellow");
// 注意:负数是从后往前数 -2 -1 0 相当于 第二个到倒数第二个 green blue
array_splice($input, 1, -1, array("black", "maroon"));
var_dump($input);
/* array(4) { [0]=> string(3) "red" [1]=> string(5) "black" [2]=> string(6) "maroon" [3]=> string(6) "yellow" }*/
array_keys 获取数组的键组成的数组
https://www.php.net/manual/zh/function.array-keys.php
$staff = ['id'=>1,'name'=>'zhang','gender'=> true,'age'=>18,'salary'=>666];
$res = array_keys($staff);
print_r(implode("---",$res));
/* id---name---gender---age---salary */
array_key_exists():判断数组的键名或索引是否存在
https://www.php.net/manual/zh/function.array-key-exists.php
$staff = ['id'=>1,'name'=>'zhang','gender'=> true,'age'=>18,'salary'=>666];
// 遍历方式查找索引名
$res = false;
foreach($staff as $key=>$value){
if($key==='age'){
$res = true;
}
}
echo $res?"存在":"不存在";
// 利用系统内置函数实现 array_key_exists()
$res = array_key_exists("gender",$staff);
echo $res?"存在":"不存在";
array_search — 在数组中搜索给定的值,返回该值对应的索引
https://www.php.net/manual/zh/function.array-search.php
// array_search — 在数组中搜索给定的值,如果成功则返回首个相应的键名
$array = array(0 => 'blue', 1 => '52', 2 => 'green', 3 => 52);
echo array_search('green', $array); // $key = 2;
echo array_search(52, $array); // $key = 1;
// 第三个参数 true,则将在数组中检查完全相同的元素 true === false ==
echo array_search(52, $array,true); // $key = 3;
in_array() 检查数组中是否存在某个值,存在返回true 否则false
https://www.php.net/manual/zh/function.in-array.php
<?php
$a = array(array('p', 'h'), array('p', 'r'), 'o');
if (in_array(array('p', 'h'), $a)) {
echo "'ph' was found\n";
}
if (in_array(array('h', 'r'), $a)) {
echo "'hr' was found\n";
}
if (in_array('o', $a)) {
echo "'o' was found\n";
}
/*
'ph' was found
'o' was found
*/
// 第三个可选参数,同样是 true 严格比较=== 默认为false ==
?>
array_values 返回数组中所有的值,并给其重新建立数字索引
https://www.php.net/manual/zh/function.array-values.php
$array = array("size" => "XL", "color" => array("gold",'red',"green"));
echo "<pre>";
print_r(array_values($array));
// 关联数组已被修改为 0 1 2 的索引数组且按照顺序
/*
Array
(
[0] => XL
[1] => Array
(
[0] => gold
[1] => red
[2] => green
)
)
*/
array_walk 使用自定义函数对数组中的每个元素做回调处理
https://www.php.net/manual/zh/function.array-walk.php
$fruits = array("d" => "lemon", "a" => "orange", "b" => "banana", "c" => "apple");
// 回调函数的三个形参分别为: 数组的值 ,数组的键,自定义传递的参数
function test_alter(&$item,$key,$prefix){
$item = "$prefix: $item";
}
function test_print($item, $key)
{
echo "{$key}. {$item}<br />\n";
}
array_walk($fruits, 'test_print');
echo "<hr>";
$fruits = array_values($fruits);
array_walk($fruits, 'test_print');
echo "<hr>";
// 参数分别为:数组、回调函数、回调函数的参数……
array_walk($fruits, 'test_alter', 'fruit');
// 也可以直接传递一个匿名函数
array_walk($fruits, function ($item, $key)
{
echo "{$key}. {$item}<br />\n";
});
/*
d. lemon
a. orange
b. banana
c. apple
---------------------------------
0. lemon
1. orange
2. banana
3. apple
--------------------------------
0. fruit: lemon
1. fruit: orange
2. fruit: banana
3. fruit: apple
*/
// array_walk的回调函数也可以使用闭包use关键字获取全局变量
下面我们来做一下,给我们最喜欢吃的水果加上My favorite
$favorite = 'fruit: orange';
array_walk($fruits,function(&$item,$key,$suffix)use($favorite){
if($item == $favorite){
$item .= $suffix;
}
},' My favorite');
echo "<hr>";
array_walk($fruits, 'test_print');
/*
0. fruit: lemon
1. fruit: orange My favorite
2. fruit: banana
3. fruit: apple
*/
array_map — 为数组的每个元素应用回调函数
https://www.php.net/manual/zh/function.array-map.php
// array_map() 该函数和array_walk功能相似,也是利用回调函数对数组进行处理,只是参数顺序不同
// 返回处理过后的数组,第一个参数回调函数,第二个为数组
$arr = array_map(function($v){
return $v*2;
},[1,2,3,4,5]);
echo implode(",",$arr);
// 2,4,6,8,10
array_filter() 使用回调函数过滤数组中的元素
https://www.php.net/manual/zh/function.array-filter.php
$arr = array_filter([1,2,7,8,10,98],function($v){
return $v>=7;
};
echo "<pre>";
print_r($arr);
/*
Array
(
[2] => 7
[3] => 8
[4] => 10
[5] => 98
)
*/
// 但是我们看到,过滤后的数组的索引不是从零开始的了,我们需要使用arrya_values处理一下
$res = array_values($arr);
echo "<pre>";
print_r($res);
/*
Array
(
[0] => 7
[1] => 8
[2] => 10
[3] => 98
)
*/
函数 | 说明 |
---|---|
sort() | 对数组元素进行升序排序(从小到大)。 |
rsort() | 对数组元素进行降序排序(从大到小)。 |
asort() | 对数组元素进行升序排序(从小到大),并保持索引关系。 |
arsort() | 对数组元素进行降序排序(从大到小),并保持索引关系。 |
ksort() | 按照数组的键值对数组进行升序排序(从小到大),并保持索引关系。 |
krsort() | 按照数组的键值对数组进行降序排序(从大到小),并保持索引关系。 |
// count()和sizeof():获取数组长度 implode():数组转字符串
$num = [8,4,6,7,2,3,18,32,1,23];
echo "count计算数组长度为".count($num)."<br>"; // 10
echo "sizeof计算数组长度为".sizeof($num)."<br>"; // 10
echo implode(',',$num)."<br>"; // 8,4,6,7,2,3,18,32,1,23
// 使用sort排序后的数组(sort升序rsort降序)
sort($num);
echo implode(',',$num)."<br>"; // 1,2,3,4,6,7,8,18,23,32
echo "<pre>";
print_r($num);
/*
Array
(
[0] => 1
[1] => 2
[2] => 3
[3] => 4
[4] => 6
[5] => 7
[6] => 8
[7] => 18
[8] => 23
[9] => 32
)
*/
// asort()排序,键值保持原有关系(asort升序arsort降序)
$num = [8,4,6,7,2,3,18,32,1,23];
asort($num);
echo implode(',',$num)."<br>"; // 1,2,3,4,6,7,8,18,23,32
echo "<pre>";
print_r($num);
/*
Array
(
[8] => 1
[4] => 2
[5] => 3
[1] => 4
[2] => 6
[3] => 7
[0] => 8
[6] => 18
[9] => 23
[7] => 32
)
*/
current():返回数组的当前元素
key():返回数组中当前元素的键名
next()与prev():向上/下移动数组指针
reset()和end():将数组内部指针指向数组第一个/最后一个元素
list():把数组中的值赋给一组变量(数组解构)
$arr = ['red','yellow','blue','pink','green','gay'];
echo current($arr); // red
echo key($arr); // 0
next($arr);
echo current($arr); // yellow
next($arr);
echo current($arr); // blue
end($arr);
echo current($arr); // gay
echo current($arr); // gay
reset($arr);
echo current($arr); // red
list($a,$b,,$d)=$arr;
echo $a,$b,$d; // red yellow pink
数组截取函数 array_slice
$num = [11,22,33,44,55,66];
echo "<br>截取的元素:";
print_r(implode(',',array_slice($num,2,3));
// 截取的元素:33,44,55
在 PHP 开发过程中,有相当大的部分是与数组打交道,例如入库的内容、统计相关内容等操作都离不开数组,很多信息都是用数组作为载体的。所以数组的操作在 PHP 编程中占有很大的比重,只有熟练地操作数组才能更好的编写 PHP 程序。
除了前面我们介绍到的一些函数外,PHP 中还提供了很多特定功能的数组函数,本节我们就来归纳一下 PHP 中常用的数组处理函数。
访问PHP手册 https://www.php.net/manual/zh/ref.array.php 来查看更详细的内容
数组的键/值操作:
数组的拆分、合并:
数组的填充与清除:
数组的计算:
其它数组函数:
<?php
$data = [['name'=>'zhangdan','id'=>2],['name'=>'lisi','id'=>1]];
echo "<pre>";
print_r($data);
array_walk($data,function(&$arr,$k,$name){
$arr[$name]=$arr['name'];
unset($arr['name']);
},'user');
echo "<pre>";
print_r($data);
?>
<?php
$arr = range(1,100);
print_r($arr);
$res = array_filter($arr,function($v){
return $v%2==0;
});
print_r(array_values($res));
?>
大多数的痛苦,都是因为自己跟自己过不去。心是收藏快乐的,别让它困于计较中,最后都盛了痛;别总执迷于困境,挤走原本难得的快乐。