PHP数组知识
1、数组介绍
在PHP中,数组是一种用于存储多个值的数据结构。它是一种有序的、可变长度的容器,可以在其中存储不同类型的数据,包括整数、字符串、对象、甚至其他数组。
在 PHP 中有两种数组:索引数组和关联数组。
- 索引(indexed)数组的索引值是整数,以 0 开始。当通过位置来标识东西时用索引数组。
- 关联(associative)数组以字符串做为索引值,关联数组更像操作表。索引值为列名,用于访问列的数据
在 PHP 中数组分:一维数组和多维数组。
$arr = [1,2,3,4,5]; //索引数组 (一维数组)
$arr[0]; // 读取 结果:1
$arrg = ['name' => '张飞','age' => 18, 'ap'=> 89, 'mp' => 100]; //关联数组 (一维数组)
$arrg['name'];// 读取 结果:'张飞'
//索引数组 (多维数组)
$arrs = [
[1,2,3],
[4,5,6],
[7,8,9]
];
$arrs[1][2]; // 读取 结果:6
//关联数组 (多维数组)
$arrgs = [
[ 'name' => '张飞','age' => 18, 'ap'=> 89, 'mp' => 100],
[ 'name' => '刘备','age' => 28, 'ap'=> 69, 'mp' => 100],
[ 'name' => '关羽','age' => 38, 'ap'=> 99, 'mp' => 100],
];
$arrgs[1]['name']; // 读取 结果:'刘备'
2、遍历数组
2.1 使用指针读取数组的值 current() ,next(), prev(), reset(),end(),key(),each()
reset()
: 将数组的内部指针重置到数组的第一个元素,并返回该元素的值。next()
: 将数组的内部指针移动到下一个元素,并返回该元素的值。prev()
: 将数组的内部指针移动到上一个元素,并返回该元素的值。end()
: 将数组的内部指针移动到最后一个元素,并返回该元素的值。key()
: 返回数组的当前指针位置的键。current()
: 返回数组的当前指针位置的值。each()
: 返回当前指针位置的键值对,并将指针移动到下一个元素。
$arr = [1,2,3,4,5,6];
echo current($arr); //结果为: 1
echo next($arr); // 结果为: 2
echo next($arr); // 结果为: 3
echo next($arr); // 结果为: 4
echo next($arr); // 结果为: 5
echo next($arr); // 结果为: 6
echo prev($arr); // 结果为: 5
echo prev($arr); // 结果为: 4
echo prev($arr); // 结果为: 3
echo prev($arr); // 结果为: 2
echo prev($arr); // 结果为: 1
echo prev($arr); // 结果为: false
reset($arr); //重置指针为第一位置
echo current($arr);
.....
$arrgs = [
[ 'name' => '张飞','age' => 18, 'ap'=> 89, 'mp' => 100],
[ 'name' => '刘备','age' => 28, 'ap'=> 69, 'mp' => 100],
[ 'name' => '关羽','age' => 38, 'ap'=> 99, 'mp' => 100],
];
while($arrg = current($arrgs)){
echo "武将:".$arrg['name'].'武力值:'.$arrg['ap'];
echo "</br>";
next($arrgs);
}
//武将:张飞武力值:89
//武将:刘备武力值:69
//武将:关羽武力值:99
使用指针读取数组数据的一个主要优点是它提供了一种灵活而高效的方式来遍历和访问数组的元素。下面是指针读取数组数据的一些优点:
- 直接访问元素:通过使用指针,可以直接访问数组中的特定元素,而无需使用索引或键。这使得代码更简洁和易读。
- 灵活的遍历:指针使得遍历数组变得更加灵活。可以自由地在数组中移动指针,访问下一个或上一个元素,或者重置指针到数组的开头。这使得可以根据需要自定义迭代逻辑。
- 节省内存:使用指针读取数组数据通常比创建额外的数组副本更节省内存。当处理大型数组时,避免复制整个数组可以减少内存占用。
- 高效的数据处理:指针读取数组数据通常比使用循环和索引访问更高效。这是因为指针直接访问内存中的元素,而不需要额外的索引计算或循环迭代。
- 支持多维数组:指针读取数组数据对于处理多维数组非常有用。通过移动多个指针,可以轻松地访问多维数组中的元素。
需要注意的是,使用指针读取数组数据也需要小心操作,确保在移动指针时不会超出数组的范围。此外,指针读取数组数据通常适用于线性遍历。
如果需要随机访问数组元素,使用索引或键可能更为适合。
2.2 foreach(), for(), list()
$arrgs = [
[ 'name' => '张飞','age' => 18, 'ap'=> 89, 'mp' => 100],
[ 'name' => '刘备','age' => 28, 'ap'=> 69, 'mp' => 100],
[ 'name' => '关羽','age' => 38, 'ap'=> 99, 'mp' => 100],
];
foreach($arrgs as $key=>$value){
echo "key".$key.'--------'.$value['name'].'-'.$value['ap'].'</br>';
}
for($i=0;$i<count($arrgs);$i++){
echo "key".$i.'--------'.$arrgs[$i]['name'].'-'.$arrgs[$i]['ap'].'</br>';
}
$arr = ['张飞','刘备','关羽'];
list($name1,$name2,$name) = $arr; // list(,,$name) = $arr;
// list(,,$name) = $arr;
// echo $name; 结果: 关羽
echo $name1; // 张飞 注意接收变量的数量需要跟数组元素个数
3、数组常用函数
3.1 数组添加删除元素
array_unshift 在数组开头插入一个或多个元素
array_push 将一个或多个元素压入数组的末尾
array_shift 将数组开头的元素移出数组
array_pop 弹出数组最后一个元素
以上操作都时传址操作!!
$arr = [1,2,3,4,5];
array_unshift($arr,100);
print_r($arr);
echo "</br>";
array_push($arr,99);
print_r($arr);
echo "</br>";
array_pop($arr);
print_r($arr);
echo "</br>";
array_shift($arr);
print_r($arr);
echo "</br>";
/*结果
Array ( [0] => 100 [1] => 1 [2] => 2 [3] => 3 [4] => 4 [5] => 5 )
Array ( [0] => 100 [1] => 1 [2] => 2 [3] => 3 [4] => 4 [5] => 5 [6] => 99 )
Array ( [0] => 100 [1] => 1 [2] => 2 [3] => 3 [4] => 4 [5] => 5 )
Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 4 [4] => 5 )
*/
3.2 计算数组元素个数
count
$num = [1,2,3];
echo count($num); // 结果为:3
3.3 判断元素是否存在数组种
in_array
$image = ['jpg','gif','bmp'];
echo in_array('jpg',$image); //结果为:1 ,即为 true
3.4 判断数组里是否有指定的键名或索引
array_key_exists
$image = ['jpg','gif','bmp'];
$name = ['name'=>'张三','age'=>88,'sex'=>'男'];
$res = array_key_exists(3, $image);
$resName = array_key_exists('name',$name);
echo $res; //结果为:null
echo '</br>';
echo $resName; //结果为:1
3.5 函数返回包含数组中所有键名的一个新数组
array_keys
$name = ['name'=>'张三','age'=>88,'sex'=>'男'];
$resName = array_keys($name);
print_r($resName);
//Array ( [0] => name [1] => age [2] => sex )
3.6 用回调函数过滤数组中的元素
array_filter
$name =[
['name'=>'张三','age'=>12,'sex'=>'男'],
['name'=>'张三','age'=>18,'sex'=>'男'],
['name'=>'张三','age'=>35,'sex'=>'男'],
['name'=>'张三','age'=>45,'sex'=>'男']
] ;
$res = array_filter($name,function ($item){
return $item['age'] < 40;
});
print_r($res);
/*
Array
(
[0] => Array
(
[name] => 张三
[age] => 12
[sex] => 男
)
[1] => Array
(
[name] => 张三
[age] => 18
[sex] => 男
)
[2] => Array
(
[name] => 张三
[age] => 35
[sex] => 男
)
)
*/
3.7 为数组的每个元素应用回调函数,结果生成新数组
array_map
$name =[
['name'=>'张三','age'=>12,'sex'=>'男'],
['name'=>'李四','age'=>18,'sex'=>'男'],
] ;
$resNewName = array_map(function($item){
$newArray = [];
$newArray['name'] = $item['name'];
$newArray['age'] = $item['age'] + 10 ;
$newArray['sex'] = $item['sex'];
return $newArray;
}, $name);
print_r($resNewName);
print_r($name);
/*
新数组增加了10岁
Array
(
[0] => Array
(
[name] => 张三
[age] => 22
[sex] => 男
)
[1] => Array
(
[name] => 李四
[age] => 28
[sex] => 男
)
)
原数组不变
Array
(
[0] => Array
(
[name] => 张三
[age] => 12
[sex] => 男
)
[1] => Array
(
[name] => 李四
[age] => 18
[sex] => 男
)
)
*/
3.8 获取数组中所有的值
array_value
$name =[
['name'=>'张三','age'=>12,'sex'=>'男'],
['name'=>'李四','age'=>18,'sex'=>'男'],
['name'=>'王五','age'=>35,'sex'=>'男'],
['name'=>'老六','age'=>45,'sex'=>'男']
] ;
foreach ($name as $n){
print_r(array_values($n));
}
/*
Array
(
[0] => 张三
[1] => 12
[2] => 男
)
Array
(
[0] => 李四
[1] => 18
[2] => 男
)
Array
(
[0] => 王五
[1] => 35
[2] => 男
)
Array
(
[0] => 老六
[1] => 45
[2] => 男
)
*/
3.9 合并一个或多个数组
array_merge
$database = [
'host'=>'localhost','port'=>3306,'user'=>'user','password'=>''];
print_r(
array_merge($database, ['user'=>'root','password'=>'admin888'])
);
/*
Array
(
[host] => localhost
[port] => 3306
[user] => root
[password] => admin888
)
假如数组key相同,会被覆盖值!!
*/
3.10 是 PHP 中的一个内置函数,用于将数组的所有键名(key)转换为指定的大小写格式。它返回一个新的数组,其中包含转换后的键名。
可选参数,指定转换后的大小写格式。可以取两个值之一:
CASE_LOWER
(默认值):将键名转换为小写形式。CASE_UPPER
:将键名转换为大写形式。
array_change_key_case
$data = array(
'FirstName' => 'John',
'LastName' => 'Doe',
'Age' => 30
);
$result = array_change_key_case($data, CASE_LOWER);
print_r($result);
如果需要比数组的值转大小写则需要手动实现
function changeValueCase($array, $case) {
foreach ($array as &$value) {
if (is_array($value)) {
$value = changeValueCase($value, $case);
} else {
$value = ($case === CASE_LOWER) ? strtolower($value) : strtoupper($value);
}
}
unset($value);
return $array;
}
$data = array(
'Name' => 'John',
'Age' => 30,
'Email' => 'JOHN@EXAMPLE.COM'
);
$result = changeValueCase($data, CASE_LOWER);
print_r($result);
/*
Array
(
[Name] => john
[Age] => 30
[Email] => john@example.com
)
*/
3.11 对数组中的每个成员递归地应用用户函数,本函数会递归到更深层的数组中去。
array_walk_recursive
参数说明:
&$array
:要遍历的数组,需要传递一个引用。$callback
:回调函数,用于处理数组中的每个元素。它可以是一个匿名函数、一个函数名或一个类方法。$userdata
:可选参数,用户自定义数据,可以在回调函数中使用。
array_walk_recursive(array &$array, callable $callback, mixed $userdata = null): bool
function double(&$value)
{
$value *= 2;
}
$data = array(
'numbers' => array(1, 2, 3),
'names' => array('John', 'Jane', 'Jim'),
'nested' => array(
'colors' => array('red', 'green', 'blue'),
'ages' => array(10, 20, 30)
)
);
array_walk_recursive($data, 'double');
print_r($data);
/*
Array
(
[numbers] => Array
(
[0] => 2
[1] => 4
[2] => 6
)
[names] => Array
(
[0] => John
[1] => Jane
[2] => Jim
)
[nested] => Array
(
[colors] => Array
(
[0] => red
[1] => green
[2] => blue
)
[ages] => Array
(
[0] => 20
[1] => 40
[2] => 60
)
)
)
*/
3.12 用于生成一个可用于表示变量的合法 PHP 代码的字符串。它将变量的值转换为字符串,并包含了该值的 PHP 表示形式。
var_export
$data = array(
'name' => 'John',
'age' => 30,
'colors' => array('red', 'green', 'blue')
);
$result = var_export($data, true);
echo $result;
/*
array (
'name' => 'John',
'age' => 30,
'colors' =>
array (
0 => 'red',
1 => 'green',
2 => 'blue',
),
)
*/
3.13 用于将变量序列化为字符串。序列化是将变量的值转换为可存储或传输的格式的过程。序列化后的字符串可以存储到文件中,也可以通过网络传输,并在需要时重新反序列化为原始的 PHP 变量形式。
**serialize ** unserialize
$data = array(
'name' => 'John',
'age' => 30,
'colors' => array('red', 'green', 'blue')
);
$resStr = serialize($data);
echo $resStr;
/*
a:3:{s:4:"name";s:4:"John";s:3:"age";i:30;s:6:"colors";a:3:{i:0;s:3:"red";i:1;s:5:"green";i:2;s:4:"blue";}}
*/
$newStr = unserialize($resStr);
/*
Array
(
[name] => John
[age] => 30
[colors] => Array
(
[0] => red
[1] => green
[2] => blue
)
)
*/