PHP 数组有两种: 数字索引数组和联合索引数组
数字索引数组定义:
$a = array('语文', '数学', '英语', '物理', '化学', '生物');
print_r($a);
输出:
Array([0] => 语文 [1] => 数学 [2] => 英语 [3] => 物理 [4] => 化学 [5] => 生物)
联合索引数组定义:
$b = array('语文'=>150, '数学'=>150, '英语'=>150, '物理'=>120, '化学'=>108, '生物'=>72);
print_r($b);
输出:
Array ([语文] => 150 [数学] => 150 [英语] => 150 [物理] => 120 [化学] => 108 [生物] => 72 )
一维数组的遍历
遍历数字索引数组:
for($i=0; $i < 6; ++$i)
echo $a[$i]." ";
输出
语文 数学 英语 物理 化学 生物
遍历联合索引数组:
foreach($b as $v) // 遍历元素值到 V 变量中
echo $v . " ";
echo "<br>";
foreach($b as $k => $v) // 分别遍历键值和元素值到 $k 和 $V 中
echo "$k:$v" . " ";
echo "<br>";
reset($b); // foreach 遍历后,必须要 reset 重置为开头元素给 while 遍历
while($e = each($b)) // 两个键值: key, value
echo $e['key'] . $e['value'] . " ";
echo "<br>";
reset($b);
while(list($k, $v) = each($b)) // 用 list 来分别获取键值和元素值 list($key, $value)
echo "$k:$v" . " ";
echo "<br>";
输出:
150 150 150 120 108 72
语文:150 数学:150 英语:150 物理:120 化学:108 生物:72
语文 150 数学 150 英语 150 物理 120 化学 108 生物 72
语文:150 数学:150 英语:150 物理:120 化学:108 生物:72
数组的排序
排序涉及 sort()
, asort()
, ksort()
, arsort()
, krsort()
sort()
是默认排序 (针对数字索引数组,如果是联合索引数组则会丢失键值,转换为数字索引数组),asort()
根据元素值升序排序,ksort()
根据键值升序排序,arsort()
和 krsort()
为对应的降序排序。
sort($a); // 升序排列 (针对数字索引数组) 元素值
print_r($a);
echo "<br>";
asort($b); // 升序排列元素值
print_r($b);
echo "<br>";
ksort($b); // 升序排列键值
print_r($b);
echo "<br>";
输出:
Array ([0] => 化学 [1] => 数学 [2] => 物理 [3] => 生物 [4] => 英语 [5] => 语文 )
Array ([生物] => 72 [化学] => 108 [物理] => 120 [英语] => 150 [数学] => 150 [语文] => 150 )
Array ([化学] => 108 [数学] => 150 [物理] => 120 [生物] => 72 [英语] => 150 [语文] => 150 )
usort()
可以对二维数组进行排序,需要写个比较函数,usort($arr, ‘compare’)
;
function compare($a, $b)
{
return $a['value'] < $b['value']; // 将根据二维数组中的 value 键值对应的元素值进行升序
}
字符串与数组的转换
采用 explode()
和implode()
函数,explode()
和 implode()
分别为切分 (返回数组) 和组合 (合并数组) 字符串函数,
$str = implode(',',$a);
echo $str;
echo "<br>";
$a = explode(',',$str);
print_r($a);
echo "<br>";
输出:
语文, 数学, 英语, 物理, 化学, 生物
Array ([0] => 语文 [1] => 数学 [2] => 英语 [3] => 物理 [4] => 化学 [5] => 生物 )
向数组中添加 / 删除元素
采用array_push($arr, $val1, $val2,)
, array_unshift($arr, $val1, $val2, ...)
, array_pop($arr)
, array_shift($arr)
,作用分别是:向数组末尾添加元素,向数组开头添加元素,向数组结尾删除元素,向数组开头删除元素。
echo " 长度:" . array_push($a, 'C 语言','离散数学') . "<br>"; // 尾部添加元素,返回数组元素个数
print_r($a);
echo "<br>";
echo " 长度:" . array_unshift($a,'体育') . "<br>"; // 头部添加元素,返回元素个数
print_r($a);
echo "<br>";
echo " 删除了:" . array_pop($a) . "<br>"; // 尾部删除,返回删除的元素
print_r($a);
echo "<br>";
echo " 删除了:" . array_shift($a) . "<br>"; // 头部删除,返回删除到元素
print_r($a);
echo "<br>";
输出:
长度:8
Array ([0] => 语文 [1] => 数学 [2] => 英语 [3] => 物理 [4] => 化学 [5] => 生物 [6] => C 语言 [7] => 离散数学 )
长度:9
Array ([0] => 体育 [1] => 语文 [2] => 数学 [3] => 英语 [4] => 物理 [5] => 化学 [6] => 生物 [7] => C 语言 [8] => 离散数学 )
删除了: 离散数学
Array ([0] => 体育 [1] => 语文 [2] => 数学 [3] => 英语 [4] => 物理 [5] => 化学 [6] => 生物 [7] => C 语言 )
删除了: 体育
Array ([0] => 语文 [1] => 数学 [2] => 英语 [3] => 物理 [4] => 化学 [5] => 生物 [6] => C 语言 )
查询数组中的元素
采用 in_array()
, array_key_exists()
, array_search()
, array_keys()
, array_values()
函数。
in_array($value, $arr)
判断 $value
(元素值) 值是否在数组中
array_key_exists($key, $arr)
判断数组中是否有名为 $key
的键名,针对联合索引数组
array_search($value, $arr)
判断数组中是否有值为$value
,针对联合索引数组
array_keys($arr)
返回一个将(联合索引数组)键名作为元素的数字索引数组
array_values($arr)
返回一个(联合索引数组)元素值作为元素的数字索引数组
if(in_array('语文', $a)) // 判断元素值是否在数组中
echo "yes<br>";
else
echo "no<br>";
if(array_key_exists('语文', $b)) // 判断键名是否在数组(联合索引数组)中
echo "yes<br>";
else
echo "no<br>";
if(array_search('72', $b)) // 判断元素值是否在数组(联合索引数组)中
echo "yes<br>";
else
echo "no<br>";
$k = array_keys($b); // 分离键名(联合索引数组)
print_r($k);
echo "<br>";
$v = array_values($b); // 分离元素值(联合索引数组)
print_r($v);
echo "<br>"
输出:
yes
yes
yes
Array ([0] => 语文 [1] => 数学 [2] => 英语 [3] => 物理 [4] => 化学 [5] => 生物 )
Array ([0] => 150 [1] => 150 [2] => 150 [3] => 120 [4] => 108 [5] => 72 )
统计数组中元素个数
采用 count($arr)
函数可以返回数组元素个数,array_count_values($arr)
,返回一个数组。
echo count($a) . " 个元素 <br>"; // 返回元素值个数
echo count($b) . " 个元素 <br>"; // 同上
$c = array_count_values($b); // 返回一个统计数组元素值的个数的数组
print_r($c);
echo "<br>";
输出:
6 个元素
6 个元素
Array ([150] => 3 [120] => 1 [108] => 1 [72] => 1 )
删除数组中重复元素
采用 array_unique($arr)
删除数组中重复的元素值(以元素值为准),返回删除重复元素后的数组。
$c = array('语文', '数学', '英语', '物理', '化学', '生物', '语文', '语文');
print_r(array_unique($c)); // 返回删除重复元素后的数组。
echo "<br>";
print_r($c);
echo "<br>";
输出:
Array ([0] => 语文 [1] => 数学 [2] => 英语 [3] => 物理 [4] => 化学 [5] => 生物 )
Array ([0] => 语文 [1] => 数学 [2] => 英语 [3] => 物理 [4] => 化学 [5] => 生物 [6] => 语文 [7] => 语文 )
调换数组中的键名和元素值
采用 array_flip($arr)
函数返回调换数组中的键名和元素值后的数组。
print_r(array_flip($b)); // 返回调换数组中的键名和元素值后的数组
echo "<br>";
print_r($b);
输出:
Array ([150] => 英语 [120] => 物理 [108] => 化学 [72] => 生物 )
Array ([语文] => 150 [数学] => 150 [英语] => 150 [物理] => 120 [化学] => 108 [生物] => 72 )
数组的序列化
数组的序列化就是将数组的数据转换为字符串,与之对应的操作就是反序列化。
采用 serialize($arr)
返回字符串和 unserialize($str)返回数组的函数。
$str=serialize($b);
echo $str . "<br>";
print_r(unserialize($str));
输出:
a:6:{s:6:" 语文 ";i:150;s:6:" 数学 ";i:150;s:6:" 英语 ";i:150;s:6:" 物理 ";i:120;s:6:" 化学 ";i:108;s:6:" 生物 ";i:72;}
Array ([语文] => 150 [数学] => 150 [英语] => 150 [物理] => 120 [化学] => 108 [生物] => 72 )
数组到合并与联合
数组的合并是多个数组的元素值合并为一个数组,而联合是一个数组作为键名,一个数组作为元素值进行合并。
array_merge($arr1, $arr2, ...)
合并,array_combine($arr1, $arr2)
联合(要求 $arr1
和$arr2
的元素个数一致)。
$a = array('语文', '数学', '英语', '物理', '化学', '生物');
$c = array(150, 150, 150, 120, 108, 72);
print_r(array_merge($a, $c)); // 两数组合并
echo "<br>";
print_r(array_combine($a, $c)); // 两数组联合
输出:
Array ([0] => 语文 [1] => 数学 [2] => 英语 [3] => 物理 [4] => 化学 [5] => 生物 [6] => 150 [7] => 150 [8] => 150 [9] => 120 [10] => 108 [11] => 72 )
Array ([语文] => 150 [数学] => 150 [英语] => 150 [物理] => 120 [化学] => 108 [生物] => 72 )
清理数组
unset($arr)
清理数组,完全释放资源。
unset($a);
unset($b);