数组可以在单独的变量名中存储一个或多个值,在PHP中是最常见的数据结构,非常重要。
PHP中创建数组
1. 使用array()函数来构件数组
<?php
// [1] 类型单一的数组
$arr1 = array('a', 'b', 'c');
print_r($arr1);
/*
Array
(
[0] => a
[1] => b
[2] => c
)
*/
// [2] 混合类型的数组
$arr2 = array('a', 'b', 2, 2.4);
print_r($arr2);
/*
Array
(
[0] => a
[1] => b
[2] => 2
[3] => 2.4
)
// [3] 键值类型的数组
$arr3 = array(0 => 'a', 'c' => 'b', 2, 2.4);
print_r($arr3);
/*
Array
(
[0] => a
[c] => b
[1] => 2
[2] => 2.4
)
*/
*/
2. 使用变量名称+索引值来创建数组
<?php
// [1] 不指定下标添加元素,就像入栈 push 将每次添加的元素都从末尾加入。
// 而且,数组下标默认从0开始累加。
$arr1[] = 1;
$arr1[] = 2;
$arr1[] = 3;
print_r($arr1);
/*
Array
(
[0] => 1
[1] => 2
[2] => 3
)
*/
// [2] 指定数组下标加入元素,注意看哪怕3>2>1,数组中元素的排列顺序还是按照默认的末尾添加顺序
$arr2[3] = 6;
$arr2[2] = 4;
$arr2[1] = 2;
print_r($arr2);
/*
Array
(
[3] => 6
[2] => 4
[1] => 2
)
*/
3. 类似于js的[]方式,好处是看起来便捷
<?php
// 从第二个打印数组的结构中,我们可以明确得出这样一个结论:如果没有指定索引也就是键,它默认从0开始
$arr3 = [1, 2, 3];
$arr4 = ['a' => 1, 2, 'b' => 3];
print_r($arr3);
print_r($arr4);
/*
Array
(
[0] => 1
[1] => 2
[2] => 3
)
Array
(
[a] => 1
[0] => 2
[b] => 3
)
*/
如果我们是这样一个混乱的数组呢,再来看一下
<?php
$arr = ['a' => 1, 3 => 2, 1 => 3, 'c' => 4, 5];
print_r($arr);
/*
Array
(
[a] => 1
[3] => 2
[1] => 3
[c] => 4
[4] => 5
)
我们可以看到,5的索引是数字4.这就表示它会自动寻找并添加一个最大的数字给
没有指定的元素,而且是从左到右。哈哈
*/
小结
PHP中的数组分类
- 索引数组
- 关联数组
- 多维数组
PHP中数组的特点
- 数据类型可以不同
- 以键值对的形式存在
- 默认数组下标从0开始,一次叠加
- 它不想Java中的数据是定长的
- 如果不指定默认的索引,会自动计算出最大的数字作为索引,从左到右。
- 默认添加是,末尾添加
PHP数组的遍历
1. for循环遍历
<?php
// [1] 遍历普通数值型索引数组
$arr = [5, 2, 1, 2, 4, 7];
for ($i = 0; $i < count($arr); $i++) {
echo $arr[$i] . "\t";
}
// 5 2 1 2 4 7
2. foreach循环遍历
<?php
// [1] 遍历非数值索引的关联数组-我们可以选择将键和值都输出查看
$age = array("Bill" => "63", "Steve" => "56", "Elon" => "47");
foreach ($age as $x => $x_value) {
echo "key:$x, value:$x_value \t";
}
// key:Bill, value:63 key:Steve, value:56 key:Elon, value:47
// [2] 我们也可以只查看值不看键
foreach ($age as $value) {
echo "value:$value \t";
}
// value:63 value:56 value:47
3. PHP 中的 foreach循环
- PHP中的foreach只能对数组和对象使用,对于其它的数据类型会报错
- 有两种结构
- 1️⃣ foreach($arr as $value) : 只需要键值对中的值
- 2️⃣ foreach($arr as $key => $value):键值对中的值和键我都需要
- 当 foreach 开始执行时,数组内部的指针会自动指向第一个单元。不需要在 foreach 循环之前调用 reset()
- foreach 依赖内部数组指针,在循环中修改其值将可能导致意外的行为。
- 一般我自己不愿意在foreach() 内部修改值,但其实这也是可以的
<?php
// [1] 通过foreach 将数组内部的元素x2
$arr = array(1, 2, 3, 4);
foreach ($arr as &$value) {
$value = $value * 2;
}
print_r($arr);
unset($value); // 最后取消掉引用
/*
Array
(
[0] => 2
[1] => 4
[2] => 6
[3] => 8
)
*/
// [2] 变量则不行
foreach (array(1, 2, 3, 4) as &$value) {
$value = $value * 2;
}
print_r($arr);
PHP数组的深入分析
PHP数组的排序
1. sort()-由低到高,不保留原索引
- 作用:对数组进行排序由低到高。
- 参数:
- 1️⃣:需要被排序的数组
- 2️⃣:(可选参数)排序的类型标记
SORT_REGULAR
- 正常比较单元(不改变类型)SORT_NUMERIC
- 单元被作为数字来比较SORT_STRING
- 单元被作为字符串来比较SORT_LOCALE_STRING
- 根据当前的区域(locale)设置来把单元当作字符串比较,可以用 setlocale() 来改变。SORT_NATURAL
- 和 natsort() 类似对每个单元以”自然的顺序”对字符串进行排序。 PHP 5.4.0 中新增的。SORT_FLAG_CASE
- 能够与SORT_STRING
或SORT_NATURAL
合并(OR 位运算),不区分大小写排序字符串。
- 返回值:
- 成功返回True
- 失败返回false
默认升序,数字由小到大排序,字母abcd排序,会重新排列键值,从新排列的索引从新按照0,1,2 这样的来排列
<?php
// [1] 不使用参数 对数字数组
$arr1 = [5, 2, 1, 2, 4, 7];
sort($arr1);
print_r($arr1);
/*
Array
(
[0] => 1
[1] => 2
[2] => 2
[3] => 4
[4] => 5
[5] => 7
)
*/
// [2] 不使用参数对 字符数组
$arr2 = ['bbb', 'apple', 'km', 'cs'];
sort($arr2);
print_r($arr2);
/*
Array
(
[0] => apple
[1] => bbb
[2] => cs
[3] => km
)
*/
// [3] 对关联数组
$arr3 = ['b' => 'b', 'a' => 'a', 'k' => 'k', 'c' => 'c'];
sort($arr3);
print_r($arr3);
/*
Array
(
[0] => a
[1] => b
[2] => c
[3] => k
)
*/