欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  php教程

第5章 数组 Array

程序员文章站 2022-06-03 22:54:00
...

数组是数据值的集合,按有序的“key-value”对应关系来阻止。 本章将学习如何创建,增加和删除数组元素,以及遍历数组内容。因为数组非常普遍而且有用,所以在php中有许多用于数组的内置函数。 索引数组 和 关联数组 在php中有两种数组:索引数组,关联数组

数组是数据值的集合,按有序的“key-value”对应关系来阻止。

本章将学习如何创建,增加和删除数组元素,以及遍历数组内容。因为数组非常普遍而且有用,所以在php中有许多用于数组的内置函数。

索引数组 和 关联数组

在php中有两种数组:索引数组,关联数组。

  • 索引(indexed)数组的键名是整数并且是从0开始。当你需要通过位置识别元素时可以使用索引数组。
  • 关联(associative)数组的键名是字符串,看起来像有两个列的数据表。第一列是用于访问键值的键名,第二列是键值value。

php内部将所有的数组都存储为关联数组,所以关联数组和索引数组的唯一区别在于key是什么。

识别数组元素

  • 可以用数组变量的名字跟括在中括号中的元素健(索引)来访问数组中特定的值、
    $age['Fred']
    $shows[2]
  • 健可以是一个字符串或者一个整数。等价于整数的字符串值被当做整数对待,如:$array[3]和 $array['3']引用相同的元素,但是$array['03']引用另外的元素
  • 负数是有效的健,并且他们不像在perl中那样从数组的末尾逆序的置顶位置。
  • 使用引号是很好的php风格,因为没有引号的健不能和常量区别开,当你把一个常量当做无引号的索引使用时,php会把常量的值当做索引使用。
    define(‘index’,5);
    echo $array[index]; //检索$array[5]
  • 如果要在键名中使用变量替换(variable interpolation)来建立数组索引,必须使用引号(这样才能进行变量解析):
    $age['Clone$number'];
  • 但是要通过变量替换得到某个数组元素,则键名不要使用引号:
    print “hello $person['name']“; //错误
    print “hellow $person[name]“;

在数组中存储数据

如果数组不存在,那么向数组存放值将创建该数组,但是在一个未定义的数组中检索值不会创建数组,如:

echo $address[0];
echo $address;
$address[0] = 'dirt-life.net';
echo $address;   // 输出array

下面的代码用简单的赋值来初始化程序中的一个数组:

$address[0] = '111';
$address[1] = '222';
$address[2] = '333';

下面代码建立一个关联数组

$price['gasket'] = 12;
$price['weel'] = 20;
$price['trie'] =50;

初始化数组的一种更容易的方法是使用array()语言结构,该结构根据它的参数来创建一个数组。下面创建了一个索引数组,索引值是自动创建的:

$array = array('d','c','e');

使用array来创建关联数组,可以使用=>符号来分割索引和值:

$price = array(
        'gasket' => 12,
        'wheel' => 15,
        'tire' => 50
    );

注意使用空白符和对齐。虽然我们也可以把代码都挤在一起,但是那样不容易阅读,
要创建一个空数组,则不传递参数给array();

$array = array();

可以使用=>来指定一个初始索引,并在后面跟着一系列键值。键值从初始健开始插入到数组中,后面的元素索引是连续的:

$days = array(1=> 'monday','tuesday','wednesday','thursday','friday','saturday','sunday');

如果初始索引是一个非数字的字符串,那么后面的索引是从0开始的整数。

在数组的末尾添加值

要把更多的值插入到一个已存在的索引数组末尾,使用[]语法:

$array = array('fred','jim');
$array[] = 'shouyan'; //$array[2]  是shouyan

这个语言结构假设该数组的索引是数字,并且把元素分配给下一个可用的数字索引,数字索引从0开始。试图添加值到一个关联数组是程序员常犯的错误,但是php会给新的索引数字索引而不发出警告:

指定值的范围

range()函数创建一个连续整数或字符的数组,整数或字符的值在传递给函数的两个参数之间。如:

$number = range(2,5);  // $number = array(2,3,4,5)
$letters = range('a','z'); //保存字母表到数组中
$reversed_numbers = range(5,2) //$number = array(5,4,3,2)

字符串参数中只有第一个字母被用于限定范围:

range('aaa','zzz') //和range('a','z')相同

获得数组大小

count()和sizeof()函数在用法和效果上是完全一样的,你想使用哪个函数都可以,他们返回数组中元素的个数。

$family = array('fred','wilma','pebbles');
$size = count($family);

这些函数并不根据任何可能出现的数字索引来计算元素个数.

填充数组

要用重复的内容来创建一个数组,可以使用 array_pad() 函数。array_pad() 函数的第一个参数是数组,第二个参数是你想要数组拥有的最少元素个数,第三个参数是要给每个元素的初始值。
array_pad(input, pad_size, pad_value) 返回一个填充得到的新数组,而丢弃它的参数数组,注意新值是如何添加到数组的末尾的,如果想让新值增加到数组的开头,可以把第二个参数设为负值。

$secores  = array(5,10);
$paded = array_pad($secores, 5, 0) //(5,10,0,0,0)

多维数组

数组中的值也可以是数组。这使你可以轻松的创建多维数组:

$row_0 = array(1,2,3);
$row_1 = array(4,5,6);
$multi = array($row_0,$_row_1);

可以通过添加更多的[]来引用多维数组的元素:

$value = $multi[1][0] //4

要使用变量替换来访问多维数组中的元素,必须将整个元素使用大括号扩起来:

echo('the value at row 2,colimen 0 is {$multi[1][0]\n}');

如果不适用大括号,则输出结果为 Array[0]

析取数组

要把一个数组的所有制都复制到变量中,可以使用list结构:
list($variable,…) = $array
数组的值按照数组的内部顺序被复制到列出的变量中。在默认情况下这个顺序就是他们被插入的顺序。

$person = array('F',35,'B');
list($name,$age,$wife) = $person; //$name F $age 35 $wife B
  • 如果数组中的元素比 list() 中的变量多,则多余的值就被忽略;
  • 如果 list() 中的值比数组中的多,则多余的值就被设为NULL;
  • 在list()中使用两个或者多个连续的逗号来跳过数组中的值

切割数组

要稀缺数组的一个子集,可以使用 array_slice(array, offset, length) 函数
* 一般来说只有在索引数组上使用 array_slice(array, offset)才有意义
* 结合 list() 和 array_slice(array, offset) 析取一些值到变量中。

$order = array('t','a','ax','s');
list($second,$third) = array_slice($order, 1, 2);

数组分块 array_chunk()

$chunks = array_chunk(array;, size [, preserve_key]);

键和值(key-value);

array_keys(input) 函数根据内部顺序返回一个仅由数组中的键组成的数组:
array_values(input) 这个函数较少使用。

检查元素是否存在

要检查数组中的一个元素是否存在,使用 array_key_exists(key, array) 函数,返回一个布尔值,如果数组中存在名为key的有效键,则返 true,否则返回false。

if(array_key_exists('name', $array)){
}

或者使用 isset(var)函数代替,如果元素存在且不为NULL,则函数返回true;(p149)

在数组中删除和插入元素

array_splice(input, offset [, length [, replacement]])函数可以在数组中删除或者插入元素,并且可以用被删除的元素创建另一个数组
$removed = array_splice(input, offset [, length [, replacement]]);

$subjects = array('a','b','c','d','e','f','g');

* 我们可以告诉array_splice()从位置2开始删除3个元素,这样可以删除c,d,e三个元素,如果省略 length参数,则会删除到数组末尾:
$removed = array_splice($subjects, 2, 3)
* 要在元素被删除的位置插入元素,应该使用第四个参数,替换数组的个数不需要和被删除元素的数组相同。数组可以按需要增长或收缩:
$new = array(‘x’,'y’);
array_splice($subjects, 4, 3, $new);
* 想得到把新元素插入到数组的效果,要把已存在的元素推到右边,删除0个元素:
$new = array(‘x’,'y’);
array_splice($subjects, 4, 0, $new);
* array_splice()函数也可以用于关联数组

在数组和变量间转换 extract() compact()

  • 从数组中创建变量
    $person = array(‘name’=>’fred’,'age’=>35,’wife’=>’betty’);
    extract($person); //将数组转换为变量
    extract($person,EXTR_PREFIX_ALL,’wp’); // $wp_name fred , $wp_age 35, $wp_wife
  • 从变量中创建数组
    $color = ‘red’;
    $shape = ‘clcile’;
    $float = ‘none’;

    $a = compact(‘color’,'shape’,'float’);

遍历数组

php中有几种方法来遍历数组,选择使用哪一种取决于你的数据和要执行的任务。

遍历数组元素最常用的方法是使用 foreach 结构:

访问当前元素的值

$array = array('a','b','c');
foreach ($array as $value) {
    echo "Print $value\n";
}

访问当前元素的键名

$array = array('a' => 1,'b' => 2, 'c' => 3 );
foreach ($array as $key => $value) {
    echo "print $key is $value\n"
}

迭代器函数

每个php数组都会跟中当前所处理的元素;指向当前元素的指针被称为迭代器(iterator)。php有一些函数来设置、移动和重置迭代器。迭代器函数有:

  • current(array) 返回迭代器当前指向的元素
  • reset(array) 移动迭代器到数组的第一个元素并返回该元素
  • next(array) 移动迭代器到数组的下一个元素并返回该元素
  • prev(array) 移动迭代器到数组的上一个元素并返回该元素
  • end(array) 移动迭代器到数组的最后一个元素并返回该元素
  • each(array) 以数组的形式返回当前元素的见和值,并移动迭代器到数组的下一个元素
  • key(array) 返回当前元素的健

each(array) 函数用来遍历数组元素,该函数根据元素的内部顺序来处理元素,这种方法不会像foreach那样产生一个数组拷贝,处理大数组时如果希望节约内存,这种方法是很有用的:
reset($address);
while(list($key,$value)) = each($address)){
echo “$key is $value\n”;
}
当需要把数组的一部分分离出来的时候,迭代器函数是很有用的。下面代码创建一个表格,并把管理数组的第一个索引和值作为表格的列标题:

$ages = array(
        'person'=>'age'
        'Fred' => 35,
        'Barney' => 30,
        'Tigger' => 8,
        'Pooh' =>40
    );
reset($ages);
list($c1,$c2) = each($pages);
while (list($c1,$c2) = each($ages)) {
    echo("$c1 $c2")
}

使用for循环

$arr = array('a','b','c');
for($i = 0; $i 

为数组的每个元素调用函数

php提供了一函数 array_walk(array, funcname),用于为数组中每个元素调用用户自定义函数,自动以的函数接收2个或者三个参数:
* 第一个参数是元素的值
* 第二个参数是元素的健
* 第三个参数是该函数被 array_walk() 调用时使用的值

function print_now($value, $key, $color){
    print("$value $key $color\n");
}
array_walk($arr, 'print_now','red');

数组归纳

array_walk()的近似函数 array_reduce(input, function),将一个函数依次应用于数组的每个元素来得到单个值??? ( P55 )

查找元素值

in_array()函数返回true或者false,取决于第一个参数是否是第二个参数指定的数组元素:
$arrdress = array(‘a’,'b’,'c’);
$got_a = in_array(‘a’, $arrdress) //true
$got_d = in_array(‘d’, $arrdress) //false

php 自动索引数组的值,所以 in_array() 比使用循环检查数组的每个值来寻找一个值要快得多

in_array() 的一个变种是 array_search(to_find, array),如果值被找到,in_array() 返回true,而 array_search() 返回找到元素的健:

$person = array('name'=>'fred','age'=>35,'wife'=>'willma');
$k = array_search($person, 'willma');
echo("$key");

数组的排序

排序该表了数组中元素的内部顺序并可以重写元素键名来反映新顺序。例如,可以使用排序来按从大到小排列一个的分清单,按字母排列一个名字清单或根据用户提交的消息来排列一组用户。

php提供三种对数组排序的方法(其中每种排序方式都可以按照升序,降序或用户定义函数的顺序排序):
* 按键排序,
* 不该变键的按值排序
* 按值排序并改变键

一次排序一个数组

  • 按值排序,然后从0开始重新分配索引 sort() rsort() usort()
  • 按值排序 asort() arsort() uasort()
  • 按键排序, ksort() krsort() uksort()

    $names = array(‘c’,'d’,'a’,'b’);
    sort($names) //a,b,c,d

    $numbers = array(2,1,3);
    asort($numbers) //1,2,3

    $keys = array(‘c’=>3,’a'=>1,’b'=>2);
    ksort($keys)

  • array_reverse(array) //反转
  • array_flip(trans) //键值互换
  • shuffle(array) //随机排序

作用于整个数组

  • array_sum(array)
  • array_merge(array1) 合并多个数组
  • array_diff(array1, array2) 比较两个或者多个数组数组

从数组中过滤元素

array_filter(array,callback)

function is_odd($element){
    return $element % 2;
}
$numbers = array(9,23,24,27);
$odds = array_filter($numbers,'is_odd');

集合

  • array_unique(array) 求数组的交集

堆栈

  • array_push(array, var)
  • array_pop(array)
  • array_unshift(array, var)
  • array_shift(array)