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);