php学习笔记(三)-数组

Contents

  1. 1. 数字索引数组
  2. 2. 使用不同索引的数组
  3. 3. 数组操作符
  4. 4. 多维数组
  5. 5. 排序
  6. 6. 多维数组排序
  7. 7. bool shuffle ( array &$array )随机顺序
  8. 8. 数组逆序
  9. 9. 按定界符分割字符串
  10. 10. 在数组中浏览:each(),current(),reset(),end(),next(),pos()和prev()
  11. 11. 对数组的每一个元素应用任何函数:array_walk()
  12. 12. 统计数组元素个数:count(),sizeof()和array_count_values()
  13. 13. 将数组转换成标量变量:extract()

数字索引数组

初始化

1
2
3
4
$products = array('Tires', 'Oil', 'Spark Plugs');
$numbers = range(0, 10);
$odd = range(0, 10, 2);
$letters = range('a', 'z');

访问

1
2
echo $products[0]
$products[3] = 'Fuses'; //添加新元素

使用循环访问

1
2
3
4
5
6
7
for ($i = 0; $i < 3; $i++){
echo $products[$i] . " ";
}

foreach($products as $current){
echo $current . " ";
}

使用不同索引的数组

初始化关联数组

1
$prices = array('Tires'=>100, 'Oil'=>10, 'Spark Plugs'=>4);

访问

1
2
3
4
5
6
7
$prices = array('Tires'=>100);
$prices['Oil'] = 10;
$prices['Spark Plugs'] = 4;
//等效于
$prices['Tires']= 100;
$prices['Oil'] = 10;
$prices['Spark Plugs'] = 4;

使用循环访问

1
2
3
4
5
6
7
8
9
10
11
12
13
foreach($prices as $key => $value) {
echo $key . '-' . $value . '<br>';
}
while($element = each($prices)){
echo $element['key'];
echo '-';
echo $element['value'];
echo '<br>';
}
reset($prices); //再次遍历的时候需要重置
while(list($product, $price) = each($prices)){
echo "$product - $price<br>";
}

数组操作符

  • $a + $b 联合 $a 和 $b 的联合。
  • $a == $b 相等 如果 $a 和 $b 具有相同的键/值对则为 TRUE。
  • $a === $b 全等 如果 $a 和 $b 具有相同的键/值对并且顺序和类型都相同则为 TRUE。
  • $a != $b 不等 如果 $a 不等于 $b 则为 TRUE。
  • $a <> $b 不等 如果 $a 不等于 $b 则为 TRUE。
  • $a !== $b 不全等 如果 $a 不全等于 $b 则为 TRUE。

多维数组

初始化

1
2
3
4
$products = array(array('TIR', 'Tires', 100),
array('OIL', 'Oil', 10),
array('SPK', 'Spark Plugs', 4),
);

访问

1
2
3
4
5
6
for ($row = 0 ; $row < 3; $row++){
for($column = 0; $column < 3; $column++){
echo '|' . $products[$row][$column];
}
echo '|<br>';
}

初始化

1
2
3
4
5
6
7
8
9
10
11
12
13
$products = array(array('Code'=>'TIR',
'Description'=>'Tires',
'PRice'=>100
),
array('Code'=>'OIL',
'Description'=>'Oil',
'PRice'=>10
),
array('Code'=>'SPK',
'Description'=>'Spark Plugs',
'PRice'=>4
)
);

访问

1
2
3
4
5
6
7
8
9
for($row=0; $row<3;$row++){
echo '|' . $products[$rom]['Code'] . '|' . $products[$row]['Description'] . '|' . $products[$row]['Price'] . '<br>';
}
for($row=0; $row < 3; $row++){
while (list($key,$value) = each($products[$row])){
echo "|$value";
}
echo '|<br>';
}

排序

  • sort

    1
    bool sort ( array &$array [, int $sort_flags = SORT_REGULAR ] )

    按字母, 数字升序排序

    可选的第二个参数 sort_flags 可以用以下值改变排序的行为:

    • 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 位运算),不区分大小写排序字符串。
  • asort按每个元素值进行排序 ksort按键进行排序

  • 反向排序 rsort arsort krsort

多维数组排序

按第二列(说明)字母进行排序

1
2
3
4
5
6
7
8
9
10
function compare($x,$y){
if ($x[1]==$y[1]){
return 0;
} else if ($x[1] < $y[1]){
return -1;
} else {
return 1;
}
}
usort($products,'compare');

按第三列(价格)字母进行排序

1
2
3
4
5
6
7
8
9
10
function compare($x,$y){
if ($x[2]==$y[2]){
return 0;
} else if ($x[2] < $y[2]){
return -1;
} else {
return 1;
}
}
usort($products,'compare');

usort()中的”u”代表”user”,因为这个函数要求传入用户自定义函数。asort、ksort有对应的uasort和uksort

反向排序

1
2
3
4
5
6
7
8
9
10
function reverse_compare($x,$y){
if ($x[2]==$y[2]){
return 0;
} else if ($x[2] < $y[2]){
return 1;
} else {
return -1;
}
}
usort($products,'reverse_compare');

bool shuffle ( array &$array )随机顺序

数组逆序

1
2
3
4
array array_reverse ( array $array [, bool $preserve_keys = false ] )
$numbers = range(0, 10);
$numbers = array_reverse($numbers);
$numbers = range(10, 1, -1);

array_push 将一个或多个单元压入数组的末尾

1
int array_push ( array &$array , mixed $var [, mixed $... ] )

array_pop 将数组最后一个单元弹出

1
mixed array_pop ( array &$array )

按定界符分割字符串

1
array explode ( string $delimiter , string $string [, int $limit ] )
  • delimiter:边界上的分隔字符
  • string:输入的字符串
  • limit:
    • 如果设置了 limit 参数并且是正数,则返回的数组包含最多 limit 个元素,而最后那个元素将包含 string 的剩余部分。
    • 如果 limit 参数是负数,则返回除了最后的 -limit 个元素外的所有元素。
    • 如果 limit 是 0,则会被当做 1。

在数组中浏览:each(),current(),reset(),end(),next(),pos()和prev()

  • each()间接的使用了数组的指针,其他的函数都是直接使用操作这个指针。
  • 如果创建一个新数组,那么当前指针就被初始化,并指向第一个元素,调用current($array_name)将返回第一个元素。
  • 调用each()和next()都会使指针前移。调用each($array_name)会在指针前移一个位置之前返回当前元素。next()函数则不用,它会将指针前移,然后再返回新的当前元素。
  • reset()函数将返回指向数组的第一个元素的指针(有时指针会移到数组中的某一个位置,我们想重置这个数组,就会使用这个函数)。调用end($array_name)可以将指针移到数据的末尾。reset()和end()将返回数组的第一个元素和最后一个元素。
  • prev()函数正好和next()相反。

对数组的每一个元素应用任何函数:array_walk()

有时,会以相同的方式使用或者修改数组的每一个元素。那么array_walk就提供这样的操作。

array_walk()函数的原型如下:

1
bool array_walk(array arr,string func,[mixed userdata]);
  • 第一个参数是arr,也就是需要处理的数组。
  • 第二个参数是用户自定义函数,怎么处理这个数组中的每一个元素,就需要用户写自定义操作。
  • 第三个参数是可选的,如果使用它,它可以作为一个参数传递给我们的自定义函数。
1
2
3
4
5
$numbers = range(1,10);
function my_print($value){
echo $value.'<br />';
}
array_walk($numbers,'my_print');

我们也可以对这个数组中的每一个元素进行修改等等之类的操作。如下:

1
2
3
4
5
6
7
8
$numbers = range(1,10);
function replace_number(&$value,$key,$userdata){
$value = $value * $userdata;
}
array_walk($numbers,'replace_number',2);
foreach($numbers as $value){
echo $value .'<br />';
}

上面的代码就使用了array_walk()函数的第三个参数,乘法因子,可以不用在自定义函数的固定,可以根据业务逻辑随时更换。需要注意是我们在$value变量之前加了一个&符号,表明传的是变量的引用,于C#中的ref或out类似。

统计数组元素个数:count(),sizeof()和array_count_values()

count()和sizeof()函数都可以计算数组元素中的元素个数,如果数组为空数组或没有经过初始化的变量,都返回0;

1
2
$numbers = range(1,10);
echo count($numbers); //sizeof($numbers)

array_count_values()函数,返回数组中每一个元素,出现的频率数的一个相关数组。如下:

1
2
3
4
5
$numbers = array(5,1,8,5,3,0,4,3,5);
$ac = array_count_values($numbers);
while(list($key,$value) = each($ac)){
echo $key.'--'.$value.'<br />';
}

输出如下:

1
2
3
4
5
6
5--3
1--1
8--1
3--2
0--1
4--1

将数组转换成标量变量:extract()

extract()函数的作用是将一个数组转换成一系列的标量变量,这些变量的名称必须是数组中的Key,而变量值则是数组中的值。如下:

1
2
3
$phones = array('name' => 'xiaomi','price'=>1999,'os' => 'android');
extract($phones);
echo "$name => $price => $os";
Updated: