PHP

PHP-数组函数

万物皆数组

Posted by cuizhazha on December 17, 2020

PHP数组函数

1.改变

1.1 array_chunk 分割

功能: 将一个数组分割成多个
语法:

1
array\_chunk( array $array , int $size \[, bool $preserve\_keys = false \] ) : array

说明: 将一个数组分割成多个数组,其中每个数组的单元数目由 size 决定。最后一个数组的单元数目可能会少于 size 个。
代码:

1
2
3
4
5
6
<?php
$input_array = array("a"=>"apple","b"=>"blue","c","d","e");

print\_r(array\_chunk($input_array, 2));
//设为 TRUE,可以保留数组中原来的键名
print\_r(array\_chunk($input_array, 2,True));

输出:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
Array
(
 \[0\] => Array
  (
   \[0\] => apple
   \[1\] => blue
  )
 \[1\] => Array
  (
   \[0\] => c
   \[1\] => d
  )
 \[2\] => Array
  (
   \[0\] => e
  )
)

Array
(
 \[0\] => Array
  (
   \[a\] => apple
   \[b\] => blue
  )
 \[1\] => Array
  (
   \[0\] => c
   \[1\] => d
  )
 \[2\] => Array
  (
   \[2\] => e
  )
)

1.2 array_merge 合并

功能: 合并一个或多个数组
说明: 如果后面有键名相同的会覆盖掉前面的内容,键名为数字的会添加到后面
语法:

1
array_merge ( array $array1 \[, array $... \] ) : array

代码:

1
2
3
4
5
<?php
$array1 = array("color"=>"red",2,4);
$array2 = array("a","b","color"=>"green","shape"=>"trapezoid",4);
$result = array_merge($array1,$array2);
print_r($result);

输出:

1
2
3
4
5
6
7
8
9
10
Array
(
 \[color\] => green
 \[0\] => 2
 \[1\] => 4
 \[2\] => a
 \[3\] => b
 \[shape\] => trapezoid
 \[4\] => 4
)

1.3 array_unique 去重

功能: 移除数组中重复的值
说明: 接受 array 作为输入并返回没有重复值的新数组。注意键名保留不变。array_unique() 先将值作为字符串排序,然后对每个值只保留第一个遇到的键名,接着忽略所有后面的键名。这并不意味着在未排序的 array 中同一个值的第一个出现的键名会被保留。
语法:

1
array\_unique ( array $array \[, int $sort\_flags = SORT_STRING \] ) : array

代码1:

1
2
3
4
5
<?php
$input = array("a" => "green", "red", "b" => "green", "blue", "red");
$result = array_unique($input);
print_r($result);
?>

输出:

1
2
3
4
5
6
Array
(
    \[a\] => green
    \[0\] => red
    \[1\] => blue
)

代码2:

1
2
3
4
5
<?php
$input = array(4, "4", "3", 4, 3, "3");
$result = array_unique($input);
var_dump($result);
?>

输出:

1
2
3
4
array(2) {
  \[0\] => int(4)
  \[2\] => string(1) "3"
}

输出:

1
2
3
4
5
6
7
8
Array
(
   \[0\] => Tank
   \[1\] => Morpheus
   \[2\] => Cypher
   \[3\] => Trinity
   \[4\] => Neo
)

1.4 array_combine 创建

功能:  创建一个数组,用一个数组的值作为其键名,另一个数组的值作为其值
语法:

1
array_combine ( array $keys , array $values ) : array

说明: 返回一个 array,用来自 keys 数组的值作为键名,来自 values 数组的值作为相应的值。

代码:

1
2
3
4
5
<?php
$a = array("one","two","three");
$b = array("一","二","三");
$c = array_combine($a,$b);
print_r($c);

输出:

1
( \[one\] => 一 \[two\] => 二 \[three\] => 三 )

1.5 array_fill 创建

功能: 用给定的值填充数组
语法:

1
array\_fill ( int $start\_index , int $num , mixed $value ) : array

说明: 用value参数的值将一个数组填充num个条目,键名由start_index 参数指定的开始。

代码:

1
2
3
4
5
6
<?php
$a = array_fill(5, 6, 'banana');
$b = array_fill(-2, 4, 'pear');
print_r($a);
print_r($b);
?>

输出:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Array
(
    \[5\]  => banana
    \[6\]  => banana
    \[7\]  => banana
    \[8\]  => banana
    \[9\]  => banana
    \[10\] => banana
)
Array
(
    \[-2\] => pear
    \[0\] => pear
    \[1\] => pear
    \[2\] => pear
)

1.6 array_fill_keys 创建

功能: 使用指定的键和值填充数组
语法:

1
array\_fill\_keys ( array $keys , mixed $value ) : array

说明: 使用value参数的值作为值,使用 keys 数组的值作为键来填充一个数组。

代码:

1
2
3
4
5
6
<?php
$keys = array('foo', 5, 10, 'bar');
$a = array\_fill\_keys($keys, 'banana');
print_r($a);
?>
?>

输出:

1
2
3
4
5
6
7
Array
(
    \[foo\] => banana
    \[5\] => banana
    \[10\] => banana
    \[bar\] => banana
)

1.7 array_flip 交换

功能: 交换数组中的键和值
语法:

1
array_flip ( array $array ) : array

说明: 返回一个反转后的array,例如 array 中的键名变成了值,而 array 中的值成了键名。

注意:

  • array中的值需要能够作为合法的键名(integer或者string)。如果类型不对,将出现一个警告,并且有问题的键/值对将不会出现在结果里。

  • 如果同一个值出现多次,则最后一个键名将作为它的值,其它键会被丢弃。

代码:

1
2
3
4
5
6
7
8
9
<?php
$input = array("oranges", "apples", "pears");
$flipped = array_flip($input);
print_r($flipped);

$input2 = array("a" => 1, "b" => 1, "c" => 2);
$flipped2 = array_flip($input2);
print_r($flipped2);
?>

输出:

1
2
3
4
5
6
7
8
9
10
11
12
Array
(
    \[oranges\] => 0
    \[apples\] => 1
    \[pears\] => 2
)

Array
(
    \[1\] => b
    \[2\] => c
)

1.8 array_pad 新增

功能: 以指定长度将一个值填充进数组
语法:

1
array_pad(array $array , int $size , mixed $value ) : array

说明:  返回array的一个拷贝,并用value将其填补到 size 指定的长度。如果 size 为正,则填补到数组的右侧,如果为负则从左侧开始填补。如果 size 的绝对值小于或等于 array 数组的长度则没有任何填补。

代码:

1
2
3
4
5
6
7
8
9
10
11
12
<?php
$input = array(12, 10, 9);

$result = array_pad($input, 5, 0);
// result is array(12, 10, 9, 0, 0)

$result = array_pad($input, -7, -1);
// result is array(-1, -1, -1, -1, 12, 10, 9)

$result = array_pad($input, 2, "noop");
//  $input 数组不变
?>

1.9 array_push 新增

功能: 将一个或多个单元压入数组的末尾(入栈)
语法:

1
array_push(array &$array, mixed $value1 \[, mixed $... \]) : int

说明: 将array当成一个栈,并将传入的变量压入array的末尾。array的长度将根据入栈变量的数目增加。

注意:

  • 如果用array_push()来给数组增加一个单元,还不如用$array[]= ,因为这样没有调用函数的额外负担。

代码:

1
2
3
4
5
<?php
$stack = array("orange", "banana");
array_push($stack, "apple", "raspberry");
print_r($stack);
?>

输出:

1
2
3
4
5
6
7
Array
(
    \[0\] => orange
    \[1\] => banana
    \[2\] => apple
    \[3\] => raspberry
)

1.10 array_pop 删除

功能: 弹出数组最后一个单元(出栈)
语法:

1
array_pop ( array &$array ) : mixed

说明: 弹出并返回array数组的最后一个单元,并将数组array的长度减一。

代码:

1
2
3
4
5
6
<?php
$stack = array("orange", "banana", "apple", "raspberry");
$fruit = array_pop($stack);
print_r($stack);
print_r($fruit);
?>

输出:

1
2
3
4
5
6
7
Array
(
   \[0\] => orange
   \[1\] => banana
   \[2\] => apple
)
raspberry

1.11 shuffle 打乱

功能: 打乱数组
说明: 本函数打乱(随机排列单元的顺序)一个数组。 它使用的是伪随机数产生器,并不适合密码学的场合
语法:

1
shuffle ( array &$array ) : bool

代码:

1
2
3
4
5
<?php
$input = array("Neo", "Morpheus", "Trinity", "Cypher", "Tank");
shuffle($input);
print_r($input);
?>

1.12 array_replace 替换

功能: 使用传递的数组替换第一个数组的元素
语法:

1
array_replace ( array $array1 \[, array $... \] ) : array

说明: 使用后面数组元素相同key的值替换array1数组的值。

  • 如果一个键存在于第一个数组同时也存在于第二个数组,它的值将被第二个数组中的值替换。

  • 如果一个键存在于第二个数组,但是不存在于第一个数组,则会在第一个数组中创建这个元素。

  • 如果一个键仅存在于第一个数组,它将保持不变。

  • 如果传递了多个替换数组,它们将被按顺序依次处理,后面的数组将覆盖之前的值

代码:

1
2
3
4
5
6
7
8
<?php
$base = array("orange", "banana", "apple", "raspberry");
$replacements = array(0 => "pineapple", 4 => "cherry");
$replacements2 = array(0 => "grape");

$basket = array_replace($base, $replacements, $replacements2);
print_r($basket);
?>

输出:

1
2
3
4
5
6
7
8
Array
(
    \[0\] => grape
    \[1\] => banana
    \[2\] => apple
    \[3\] => raspberry
    \[4\] => cherry
)

1.13 array_shift 删除

功能: 将数组开头的单元移出数组
语法:

1
array_shift ( array &$array ) : mixed

说明: 将 array 的第一个单元移出并作为结果返回,将 array 的长度减一并将所有其它单元向前移动一位。所有的数字键名将改为从零开始计数,文字键名将不变。

代码:

1
2
3
4
5
6
<?php
$stack = array("orange", "banana", "apple", "raspberry");
$fruit = array_shift($stack);
print_r($stack);
print_r($fruit);
?>

输出:

1
2
3
4
5
6
7
Array
(
   \[0\] => banana
   \[1\] => apple
   \[2\] => raspberry
)
orange

1.14 array_unshift 新增

功能: 在数组开头插入一个或多个单元
语法:

1
array_unshift ( array &$array \[, mixed $... \] ) : int

说明: 将传入的单元插入到 array 数组的开头。注意单元是作为整体被插入的,因此传入单元将保持同样的顺序。所有的数值键名将修改为从零开始重新计数,所有的文字键名保持不变。

代码:

1
2
3
4
5
<?php
$queue = array("orange", "banana");
array_unshift($queue, "apple", "raspberry");
print_r($queue);
?>

输出:

1
2
3
4
5
6
7
Array
(
    \[0\] => apple
    \[1\] => raspberry
    \[2\] => orange
    \[3\] => banana
)

1.15  array_splice 删除&替换

功能: 去掉数组中的某一部分并用其它值取代
语法:

1
array_splice(array &$input,int $offset \[,int$length=count($input) \[,mixed$replacement=array()\]\]) :array

说明: 把input数组中由offset和length指定的单元去掉,如果提供了replacement参数,则用其中的单元取代。

  • 如果offset为正,则从input数组中该值指定的偏移量开始移除。

  • 如果offset为负,则从input末尾倒数该值指定的偏移量开始移除。

  • 如果省略length,则移除数组中从offset到结尾的所有部分。

  • 如果指定了length并且为正值,则移除这么多单元。

  • 如果指定了length并且为负值,则移除从offset到数组末尾倒数length为止中间所有的单元。

  • 如果设置了length为零,不会移除单元。

  • 如果给出了replacement数组,则被移除的单元被此数组中的单元替代。

注意:  input中的数字键名不被保留。
代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php
$input = array("red", "green", "blue", "yellow");
array_splice($input, 2);
// $input is now array("red", "green")

$input = array("red", "green", "blue", "yellow");
array_splice($input, 1, -1);
// $input is now array("red", "yellow")

$input = array("red", "green", "blue", "yellow");
array_splice($input, 1, count($input), "orange");
// $input is now array("red", "orange")

$input = array("red", "green", "blue", "yellow");
array_splice($input, -1, 1, array("black", "maroon"));
// $input is now array("red", "green",
//          "blue", "black", "maroon")

$input = array("red", "green", "blue", "yellow");
array_splice($input, 3, 0, "purple");
// $input is now array("red", "green",
//          "blue", "purple", "yellow");
?>

2.访问

2.1 array_column 指定列

功能: 返回数组中指定的一列
语法:

1
array\_column ( array $input , mixed $column\_key \[, mixed $index_key = null \] ) : array

说明: 返回input数组中键值为column_key的列,如果指定了可选参数index_key,那么input数组中的这一列的值将作为返回数组中对应值的键。

代码:

  • 不传$index_key时
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<?php
$records = array(
    array(
        'id' => 2135,
        'first_name' => 'John',
        'last_name' => 'Doe',
    ),
    array(
        'id' => 3245,
        'first_name' => 'Sally',
        'last_name' => 'Smith',
    ),
    array(
        'id' => 5342,
        'first_name' => 'Jane',
        'last_name' => 'Jones',
    ),
    array(
        'id' => 5623,
        'first_name' => 'Peter',
        'last_name' => 'Doe',
    )
);

$first\_names = array\_column($records, 'first_name');
print\_r($first\_names);
?>

输出:

1
2
3
4
5
6
7
Array
(
    \[0\] => John
    \[1\] => Sally
    \[2\] => Jane
    \[3\] => Peter
)
  • 传$index_key时
1
2
$last\_names = array\_column($records, 'last_name', 'id');
print\_r($last\_names);

输出:

1
2
3
4
5
6
7
Array
(
    \[2135\] => Doe
    \[3245\] => Smith
    \[5342\] => Jones
    \[5623\] => Doe
)

2.2 array_keys 所有key

功能: 返回数组中部分的或所有的键名
语法:

1
array\_keys ( array $array \[, mixed $search\_value = null \[, bool $strict = false \]\] ) : array

说明: 返回input数组中的数字或者字符串的键名。

  • 如果指定了可选参数 search_value,则只返回该值的键名。否则 input 数组中的所有键名都会被返回。

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
// 所有key
$array = array(0 => 100, "color" => "red");
print\_r(array\_keys($array));

// 指定value的key
$array = array("blue", "red", "green", "blue", "blue");
print\_r(array\_keys($array, "blue"));

$array = array("color" => array("blue", "red", "green"),
               "size"  => array("small", "medium", "large"));
print\_r(array\_keys($array));
?>

输出:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Array
(
    \[0\] => 0
    \[1\] => color
)
Array
(
    \[0\] => 0
    \[1\] => 3
    \[2\] => 4
)
Array
(
    \[0\] => color
    \[1\] => size
)

2.3 array_key_first 首个key

功能: 返回数组中的第一个key
注意: 需要PHP版本:PHP7.3+
语法:

1
array\_key\_first ( array $array ) : mixed

代码:

1
2
3
4
5
<?php
$array = \['a' => 1, 'b' => 2, 'c' => 3\];
$firstKey = array\_key\_first($array);
var_dump($firstKey);
?>

输出:

1
string(1) "a"

2.4 array_key_last 末尾key

功能: 返回数组中的第一个key
注意: 需要PHP版本:PHP7.3+
语法:

1
array\_key\_last ( array $array ) : mixed

代码:

1
2
3
4
5
<?php
$array = \['a' => 1, 'b' => 2, 'c' => 3\];
$firstKey = array\_key\_last($array);
var_dump($firstKey);
?>

输出:

1
string(1) "c"

2.5 array_rand 随机取出

功能: 从数组中随机取出一个或多个单元
说明: 从数组中取出一个或多个随机的单元,并返回随机条目的一个或多个键。 它使用了伪随机数产生算法,所以不适合密码学场景
语法:

1
array_rand ( array $array \[, int $num = 1 \] ) : mixed

代码:

1
2
3
4
5
<?php
$input = array("Neo", "Morpheus", "Trinity", "Cypher", "Tank");
$rand\_keys = array\_rand($input, 2);
print\_r($rand\_keys);
?>

输出:

1
2
3
4
5
Array
(
   \[0\] => 0
   \[1\] => 3
)

2.6 array_reverse 反转

功能: 返回单元顺序相反的数组
语法:

1
array\_reverse ( array $array \[, bool $preserve\_keys = FALSE \] ) : array

说明: 接受数组 array 作为输入并返回一个单元为相反顺序的新数组。

  • 如果$preserve_keys设置为TRUE会保留数字的键。 非数字的键则不受这个设置的影响,总是会被保留

代码:

1
2
3
4
5
6
7
8
<?php
$input  = array("php", 4.0, array("green", "red"));
$reversed = array_reverse($input);
$preserved = array_reverse($input, true);

print_r($reversed);
print_r($preserved);
?>

输出:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Array
(
    \[0\] => Array
        (
            \[0\] => green
            \[1\] => red
        )

    \[1\] => 4
    \[2\] => php
)
Array
(
    \[2\] => Array
        (
            \[0\] => green
            \[1\] => red
        )

    \[1\] => 4
    \[0\] => php
)

2.7 array_search 条件查找

功能:  在数组中搜索给定的值,如果成功则返回首个相应的键名
语法:

1
array_search ( mixed $needle , array $haystack \[, bool $strict = false \] ) : mixed

说明:

  • 如果$strict为TRUE,则array_search() 将在 haystack 中检查完全相同的元素(===)

  • 如果找到了needle则返回它的键,否则返回 FALSE。

代码:

1
2
3
4
5
6
7
8
<?php
$array = array(0 => 'blue', 1 => 'red', 2 => 'green', 3 => 'red', 4=>5);

$key1 = array_search('green', $array); 
$key2 = array_search('red', $array); 
$key3 = array_search('5', $array,true);
var_dump($key1,$key2,$key3);
?>

输出:

1
2
3
int(2)
int(1)
bool(false)

2.8 array_slice 取出一段

功能:   从数组中取出一段
语法:

1
array\_slice ( array $array , int $offset \[, int $length = NULL \[, bool $preserve\_keys = false \]\] ) : array

说明:

  • 注意array_slice()默认会重新排序并重置数组的数字索引。你可以通过将 preserve_keys 设为 TRUE 来改变此行为

  • 如果给出了length并且为正,则序列中将具有这么多的单元。

  • 如果给出了length并且为负,则序列将终止在距离数组末端这么远的地方。

  • 如果省略,则序列将从offset开始一直到array的末端。

代码:

1
2
3
4
5
6
7
8
9
10
11
<?php
$input = array("a", "b", "c", "d", "e");

$output = array_slice($input, 2);      // returns "c", "d", and "e"
$output = array_slice($input, -2, 1);  // returns "d"
$output = array_slice($input, 0, 3);   // returns "a", "b", and "c"

// note the differences in the array keys
print\_r(array\_slice($input, 2, -1));
print\_r(array\_slice($input, 2, -1, true));
?>

输出:

1
2
3
4
5
6
7
8
9
10
Array
(
    \[0\] => c
    \[1\] => d
)
Array
(
    \[2\] => c
    \[3\] => d
)

2.9 array_values 所有值

功能: 返回数组中所有的值
语法:

1
array_values ( array $array ) : array

说明: 返回input数组中所有的值并给其建立数字索引

代码:

1
2
3
4
<?php
$array = array("size" => "XL", "color" => "gold");
print\_r(array\_values($array));
?>

输出:

1
2
3
4
5
Array
(
    \[0\] => XL
    \[1\] => gold
)

3.排序

3.1 arsort 对值:逆向排序

功能: 对数组进行逆向排序并保持索引关系
语法:

1
arsort ( array &$array \[, int $sort\_flags = SORT\_REGULAR \] ) : bool

说明: 对数组进行排序,数组的索引保持和单元的关联。

代码:

1
2
3
$fruits = array("d" => "lemon", "a" => "orange", "b" => "banana", "c" => "apple");
arsort($fruits);
print_r($fruits);

输出:

1
2
3
4
5
6
7
Array
(
   \[a\] => orange
   \[d\] => lemon
   \[b\] => banana
   \[c\] => apple
)

3.2 asort 对值:正向排序

功能: 对数组进行排序并保持索引关系
语法:

1
asort ( array &$array \[, int $sort\_flags = SORT\_REGULAR \] ) : bool

说明: 对数组进行排序,数组的索引保持和单元的关联。主要用于对那些单元顺序很重要的结合数组进行排序。

代码:

1
2
3
$fruits = array("d" => "lemon", "a" => "orange", "b" => "banana", "c" => "apple");
asort($fruits);
print_r($fruits);

输出:

1
2
3
4
5
6
7
Array
(
   \[c\] => apple
   \[b\] => banana
   \[d\] => lemon
   \[a\] => orange
)

3.3 rsort 对值:逆向排序

功能: 对数组进行逆向排序,不保留索引关系
语法:

1
rsort ( array &$array \[, int $sort\_flags = SORT\_REGULAR \] ) : bool

说明: 对数组进行逆向排序(最高到最低)。

代码:

1
2
3
$fruits = array("d" => "lemon", "a" => "orange", "b" => "banana", "c" => "apple");
rsort($fruits);
print_r($fruits);

输出:

1
2
3
4
5
6
7
Array
(
   \[0\] => orange
   \[1\] => lemon
   \[2\] => banana
   \[3\] => apple
)

3.4 sort 对值:正向排序

功能: 对数组进行正向排序,不保留索引关系
语法:

1
sort ( array &$array \[, int $sort\_flags = SORT\_REGULAR \] ) : bool

说明: 对数组进行逆向排序(最高到最低)。

代码:

1
2
3
$fruits = array("d" => "lemon", "a" => "orange", "b" => "banana", "c" => "apple");
sort($fruits);
print_r($fruits);

输出:

1
2
3
4
5
6
7
Array
(
   \[0\] => apple
   \[1\] => banana
   \[2\] => lemon
   \[3\] => orange
)

3.5 ksort 对key:正向排序

功能: 对数组按照键名正向排序
语法:

1
ksort ( array &$array \[, int $sort\_flags = SORT\_REGULAR \] ) : bool

说明: 对数组按照键名正向排序,保留键名到数据的关联。主要用于结合数组。

代码:

1
2
3
$fruits = array("d"=>"lemon", "a"=>"orange", "b"=>"banana", "c"=>"apple");
ksort($fruits);
print_r($fruits);

输出:

1
2
3
4
5
6
7
Array
(
   \[a\] => orange
   \[b\] => banana
   \[c\] => apple
   \[d\] => lemon
)

3.6 krsort  对key:逆向排序

功能: 对数组按照键名逆向排序
语法:

1
krsort ( array &$array \[, int $sort\_flags = SORT\_REGULAR \] ) : bool

说明: 对数组按照键名逆向排序,保留键名到数据的关联。主要用于结合数组。

代码:

1
2
3
$fruits = array("d"=>"lemon", "a"=>"orange", "b"=>"banana", "c"=>"apple");
krsort($fruits);
print_r($fruits);

输出:

1
2
3
4
5
6
7
Array
(
   \[d\] => lemon
   \[c\] => apple
   \[b\] => banana
   \[a\] => orange
)

3.7 array_multisort 多维数组排序

功能: 返回数组中所有的值
语法:

1
array\_multisort ( array &$array1 \[, mixed $array1\_sort\_order = SORT\_ASC \[, mixed $array1\_sort\_flags = SORT_REGULAR \[, mixed $... \]\]\] ) : bool

说明: 可以用来一次对多个数组进行排序,或者根据某一维或多维对多维数组进行排序。

  • 关联(string)键名保持不变,但数字键名会被重新索引

  • array1_sort_order:参数要排列的顺序,SORT_ASC升序,SORT_DESC倒序,默认 SORT_ASC

  • array1_sort_flags:

  • SORT_REGULAR - 将项目按照通常方法比较(不修改类型)

  • SORT_NUMERIC - 按照数字大小比较

  • SORT_STRING - 按照字符串比较

1. 一维数组排序

代码:

1
2
3
$a=array("Dog","Cat","Horse","Bear","Zebra");
array_multisort($a);
print_r($a);

输出:

1
2
3
4
5
6
7
8
Array
(
   \[0\] => Bear
   \[1\] => Cat
   \[2\] => Dog
   \[3\] => Horse
   \[4\] => Zebra
)

2. 多个一维数组排序

代码:

1
2
3
4
5
6
$ar1 = array(10, 100, 100, 0);
$ar2 = array(1, 3, 2, 4);
array_multisort($ar1, $ar2);

var_dump($ar1);
var_dump($ar2);

说明: 可以把$ar1和$ar2的数据可以看成一个表 如下:

$ar1

$ar2

10

1

100

3

100

2

0

4

$ar1和$ar2分别为列名,然后像sql语句一样 排序即可

1
select * from table order by $ar1 asc ,$ar2 asc

输出:

1
2
3
4
5
6
7
8
9
10
11
12
array(4) {
  \[0\]=> int(0)
  \[1\]=> int(10)
  \[2\]=> int(100)
  \[3\]=> int(100)
}
array(4) {
  \[0\]=> int(4)
  \[1\]=> int(1)
  \[2\]=> int(2)
  \[3\]=> int(3)
}

3.多维数组排序

原数据:

1
2
3
4
5
6
7
<?php
$data\[\] = array('volume' => 67, 'edition' => 2);
$data\[\] = array('volume' => 86, 'edition' => 1);
$data\[\] = array('volume' => 85, 'edition' => 6);
$data\[\] = array('volume' => 98, 'edition' => 2);
$data\[\] = array('volume' => 86, 'edition' => 6);
$data\[\] = array('volume' => 67, 'edition' => 7);

需求:将把 volume 降序排列,把 edition 升序排列。

代码:

1
2
3
4
5
6
7
8
9
10
11
12
<?php
// 取得列的列表
foreach ($data as $key => $row) {
    $volume\[$key\]  = $row\['volume'\];
    $edition\[$key\] = $row\['edition'\];
}

// 将数据根据 volume 降序排列,根据 edition 升序排列
// 把 $data 作为最后一个参数,以通用键排序
array\_multisort($volume, SORT\_DESC, $edition, SORT_ASC, $data);
print_r($data);
?>

输出:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
Array
(
   \[0\] => Array
       (
           \[volume\] => 98
           \[edition\] => 2
       )
   \[1\] => Array
       (
           \[volume\] => 86
           \[edition\] => 1
       )
   \[2\] => Array
       (
           \[volume\] => 86
           \[edition\] => 6
       )
   \[3\] => Array
       (
           \[volume\] => 85
           \[edition\] => 6
       )
   \[4\] => Array
       (
           \[volume\] => 67
           \[edition\] => 2
       )
   \[5\] => Array
       (
           \[volume\] => 67
           \[edition\] => 7
       )
)

4.判断

4.1 array_key_exists key是否存在

功能:  检查数组里是否有指定的键名或索引
语法:

1
array\_key\_exists(mixed $key , array $array) : bool

说明:

  • 数组里有键key时,返回TRUE。 key可以是任何能作为数组索引的值。

  • 仅仅搜索第一维的键。 多维数组里嵌套的键不会被搜索到。

  • key_exists函数和此函数功能一样

代码:

1
2
3
4
5
6
7
<?php
$search_array = array('first' => 1, 'second' => 4);
if (array\_key\_exists('first', $search_array)) {
    echo "key first 存在!";
} else {
    echo "key first 不存在!";
}

输出:

1
key first 存在!

array_key_exists()与isset()对比

isset() 对于数组中为 NULL 的值不会返回 TRUE,而 array_key_exists() 会。

1
2
3
4
5
6
7
8
<?php
$search_array = array('first' => null, 'second' => 4);

// returns false
isset($search_array\['first'\]);

// returns true
array\_key\_exists('first', $search_array);

4.2 in_array 值是否存在

功能:  检查数组中是否存在某个值,如果找到 则返回TRUE,否则返回 FALSE。
语法:

1
in_array ( mixed $needle , array $haystack \[, bool $strict = FALSE \] ) : bool

说明:

  • needle:待搜索的值。

  • haystack:待搜索的数组。

  • strict: 如果第三个参数strict的值为TRUE则会严格匹配类型(===)

代码:

1
2
3
4
5
6
7
8
9
10
11
12
<?php
// 非严格类型检查
$os = array("Mac", "NT", "Irix", "Linux","1");
if (in_array("Irix", $os)) {
    echo "Got Irix";
}
// 严格类型检查
if (in_array(1, $os,true)) {
    echo "存在数字 1";
} else {
    echo "不存在数字 1";
}

输出:

1
2
3
Got Irix

不存在数字 1

5.计算

5.1 array_count_values 统计值出现次数

功能:   统计数组中所有的值。
语法:

1
array\_count\_values ( array $array ) : array

说明:
结果返回一个数组:数组的键是array里单元的值; 数组的值是array单元的值出现的次数。

代码:

1
2
3
<?php
$array = array(1, "hello", 1, "world", "hello");
print\_r(array\_count_values($array));

输出:

1
2
3
4
5
6
Array
(
    \[1\] => 2
    \[hello\] => 2
    \[world\] => 1
)

5.2 array_diff_assoc 数组值的差集

功能: 带索引检查计算数组的差集。(比较value和key)
语法:

1
array\_diff\_assoc ( array $array1 , array $array2 \[, array $... \] ) : array

说明:
array_diff_assoc()返回一个数组,该数组包括了所有在array1中但是不在任何其它参数数组中的值。注意和array_diff()不同的是键名也用于比较。
代码:

1
2
3
4
5
<?php
$array1 = array("a" => "green", "b" => "brown", "c" => "blue", "red");
$array2 = array("a" => "green", "yellow", "red");
$result = array\_diff\_assoc($array1, $array2);
print_r($result);

输出:

1
2
3
4
5
6
Array
(
    \[b\] => brown
    \[c\] => blue
    \[0\] => red
)

分析:
上面的例子中可以看到键值对 “a” => “green” 在两个数组中都有,因此不在结果中的输出。与此不同,键值对 0 => “red” 出现在输出中是因为第二个参数中的 “red” 的键名是 1。

5.3 array_diff_key 数组key的差集

功能: 使用键名比较计算数组的差集。
语法:

1
array\_diff\_key(array $array1 ,array $array2 \[, array $... \] ) : array

说明:
array_diff_key()返回一个数组,该数组包括了所有出现在array1中但是未出现在任何其它参数数组中的键名的值。
代码:

1
2
3
4
<?php
$array1 = array('blue'  => 1, 'red'  => 2, 'green'  => 3, 'purple' => 4,'0'=>'test');
$array2 = array('green' => 5, 'blue' => 6, 'yellow' => 7, 'cyan'   => 8 ,'test');
print\_r(array\_diff_key($array1, $array2));

输出:

1
2
3
4
5
Array
(
    \[red\] => 2
    \[purple\] => 4
)

注意:
在 key => value 对中的两个键名仅在 (string) $key1 === (string) $key2 时被认为相等。换句话说,执行的是严格类型检查,因此字符串的表达必须完全一样。

5.4 array_diff 数组差集

功能: 计算数组的差集。(比较key)
语法:

1
array_diff(array $array1 , array $array2 \[, array $... \] ) : array

说明:
对比array1和其他一个或者多个数组,返回在array1中但是不在其他array里的值。
代码:

1
2
3
4
5
6
<?php
$array1 = array("a" => "green", "red", "blue", "red");
$array2 = array("b" => "green", "yellow", "red");
$result = array_diff($array1, $array2);

print_r($result);

输出:

1
2
3
4
Array
(
    \[1\] => blue
)

5.5 array_intersect_assoc 数组值的交集

功能: 带索引检查计算数组的交集。(比较value和key)
语法:

1
array\_intersect\_assoc(array $array1 , array $array2 \[, array $... \] ):array

说明:
返回一个数组,该数组包含了所有在array1中也同时出现在所有其它参数数组中的值。注意和array_intersect()不同的是键名也用于比较。
代码:

1
2
3
4
5
<?php
$array1 = array("a" => "green", "b" => "brown", "c" => "blue", "red");
$array2 = array("a" => "green", "b" => "yellow", "blue", "red");
$result\_array = array\_intersect_assoc($array1, $array2);
print\_r($result\_array);

输出:

1
2
3
4
Array
(
    \[a\] => green
)

5.6 array_intersect 数组值的交集

功能: 计算数组的交集。(只比较value)
语法:

1
array_intersect(array $array1 ,array $array2 \[, array $... \] ) : array

说明:
返回一个数组,该数组包含了所有在array1中也同时出现在所有其它参数数组中的值。注意键名保留不变。
代码:

1
2
3
4
5
<?php
$array1 = array("a" => "green", "red", "blue");
$array2 = array("b" => "green", "yellow", "red");
$result = array_intersect($array1, $array2);
print_r($result);

输出:

1
2
3
4
5
Array
(
    \[a\] => green
    \[0\] => red
)

5.7 array_intersect_key 数组key的交集

功能: 使用键名比较计算数组的交集。(只比较key)
语法:

1
array\_intersect\_key(array $array1 ,array $array2 \[, array $... \] ):array

说明:
返回一个数组,该数组包含了所有出现在array1中并同时出现在所有其它参数数组中的键名的值。
代码:

1
2
3
4
<?php
$array1 = array('blue'  => 1, 'red'  => 2, 'green'  => 3, 'purple' => 4);
$array2 = array('green' => 5, 'blue' => 6, 'yellow' => 7, 'cyan'   => 8);
print\_r(array\_intersect_key($array1, $array2));

输出:

1
2
3
4
5
Array
(
    \[blue\] => 1
    \[green\] => 3
)

5.8 array_product 值的乘积

功能: 计算数组中所有值的乘积
语法:

1
array_product(array $array ) : number

说明:
以整数或浮点数返回一个数组中所有值的乘积。
代码:

1
2
3
4
<?php
$a = array(2, 4, 6, 8);
echo "array\_product(a) = " . array\_product($a) . "\\n";
echo "array\_product(array()) = " . array\_product(array()) . "\\n";

输出:

1
2
array_product(a) = 384
array_product(array()) = 1

5.9 array_sum 值求和

功能: 对数组中所有值求和
语法:

1
array_sum ( array $array ) : number

说明:
将数组中的所有值相加,并返回结果。
代码:

1
2
3
4
5
6
<?php
$a = array(2, 4, 6, 8);
echo "sum(a) = " . array_sum($a) . "\\n";

$b = array("a" => 1.2, "b" => 2.3, "c" => 3.4);
echo "sum(b) = " . array_sum($b) . "\\n";

输出:

1
2
sum(a) = 20
sum(b) = 6.9

6. 递归

6.1 array_merge_recursive 合并

功能: 将一个或多个数组的单元合并起来,一个数组中的值附加在前一个数组的后面。返回作为结果的数组。
说明: 如果输入的数组中有相同的字符串键名,则这些值会被合并到一个数组中去,这将递归下去,因此如果一个值本身是一个数组,本函数将按照相应的条目把它合并为另一个数组。需要注意的是,如果数组具有相同的数值键名,后一个值将不会覆盖原来的值,而是附加到后面。
语法:

1
array\_merge\_recursive ( array $array1 \[, array $... \] ) : array

代码:

1
2
3
4
5
6
<?php
$ar1 = array("color" => array("favorite" => "red"), 5);
$ar2 = array(10, "color" => array("favorite" => "green", "blue"));
$result = array\_merge\_recursive($ar1, $ar2);
print_r($result);
?>

输出:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Array
(
    \[color\] => Array
        (
            \[favorite\] => Array
                (
                    \[0\] => red
                    \[1\] => green
                )

            \[0\] => blue
        )

    \[0\] => 5
    \[1\] => 10
)

6.2 array_replace_recursive 替换

功能: 使用传递的数组递归替换第一个数组的元素
语法:

1
array\_replace\_recursive(array $array1 \[, array $... \] ) : array

说明: 使用后面数组元素的值替换数组 array1 的值

  • 如果一个键存在于第一个数组同时也存在于第二个数组,它的值将被第二个数组中的值替换

  • 如果一个键存在于第二个数组,但是不存在于第一个数组,则会在第一个数组中创建这个元素。

  • 如果一个键仅存在于第一个数组,它将保持不变。

  • 如果传递了多个替换数组,它们将被按顺序依次处理,后面的数组将覆盖之前的值

代码:

1
2
3
4
5
6
7
8
<?php
$base = array('citrus' => array( "orange") , 'berries' => array("blackberry", "raspberry"), );
$replacements = array('citrus' => array('pineapple'), 'berries' => array('blueberry'));

$basket = array\_replace\_recursive($base, $replacements);
print_r($basket);

?>

输出:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
Array
(
    \[citrus\] => Array
        (
            \[0\] => pineapple
        )

    \[berries\] => Array
        (
            \[0\] => blueberry
            \[1\] => raspberry
        )

)

6.3 array_map 遍历

功能: 为数组的每个元素应用回调函数
语法:

1
array_map(callable $callback ,array $array1 \[, array $... \] ):array

说明:
返回数组,是为array1每个元素应用callback函数之后的数组。 callback函数形参的数量和传给array_map()数组数量,两者必须一样。

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
function cube($n)
{
    return($n * $n * $n);
}

$a = array(1, 2, 3, 4, 5);
$b = array_map("cube", $a);
print_r($b);

// 匿名函数
$a = array(1, 2, 3, 4, 5);
$sign = 10;
$b2 = array_map(function (&$value) use ($sign){
    return $value * $sign;
},$a);
print_r($b2);

?>

输出:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Array
(
    \[0\] => 1
    \[1\] => 8
    \[2\] => 27
    \[3\] => 64
    \[4\] => 125
)

// 匿名函数输出
Array
(
    \[0\] => 10
    \[1\] => 20
    \[2\] => 30
    \[3\] => 40
    \[4\] => 50
)

6.4 array_walk 遍历

功能: 使用用户自定义函数对数组中的每个元素做回调处理
语法:

1
array_walk(array &$array,callable $callback \[, mixed $userdata = NULL \]):bool

说明:

  • 如果提供了可选参数userdata,将被作为第三个参数传递给callback funcname

  • callback 接受两个参数。array参数的值作为第一个,键名作为第二个。

  • 只有array的值才可以被改变,用户不应在回调函数中改变该数组本身的结构。例如增加/删除单元,unset 单元等等

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<?php
$fruits = array("d" => "lemon", "a" => "orange", "b" => "banana", "c" => "apple");
function test_alter(&$item1, $key, $prefix)
{
    $item1 = "$prefix: $item1";
}

function test_print($item2, $key)
{
    echo "$key. $item2<br />\\n";
}
echo "Before ...:\\n";
array\_walk($fruits, 'test\_print');

array\_walk($fruits, 'test\_alter', 'fruit');
echo "... and after:\\n";
array\_walk($fruits, 'test\_print');


// 匿名函数调用
$a = array(1, 2, 3, 4, 5, 8);
$sign = 10;
array_walk($a,function (&$val,$key,$sign){
    if ($key > 2){
        $val *= $sign;
    }
},$sign);
print_r($a);
?>

输出:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Before ...:
d. lemon
a. orange
b. banana
c. apple
... and after:
d. fruit: lemon
a. fruit: orange
b. fruit: banana
c. fruit: apple

// 匿名函数调用输出
Array
(
    \[0\] => 1
    \[1\] => 2
    \[2\] => 3
    \[3\] => 40
    \[4\] => 50
    \[5\] => 80
)

6.5 array_walk_recursive 遍历

功能: 对数组中的每个成员递归地应用用户函数,(本函数会递归到更深层的数组中去)
语法:

1
array\_walk\_recursive(array &$array ,callable $callback \[, mixed $userdata = NULL \]):bool

说明:

  • 如果提供了可选参数userdata,将被作为第三个参数传递给callback funcname

  • callback 接受两个参数。array参数的值作为第一个,键名作为第二个。

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
$sweet = array('a' => 'apple', 'b' => 'banana');
$fruits = array('sweet' => $sweet, 'sour' => 'lemon');

function test_print($item, $key)
{
    echo "$key holds $item\\n";
}

array\_walk\_recursive($fruits, 'test_print');

// 匿名函数使用
$sweet = array('a' => 'apple', 'b' => 'banana');
$fruits = array('sweet' => $sweet, 'sour' => 'lemon');
$str = '===>';
array\_walk\_recursive($fruits,function ($val,$key,$str){
        echo "$key $str $val \\n";
},$str);
?>

输出:

1
2
3
4
5
6
7
8
a holds apple
b holds banana
sour holds lemon

// 匿名函数调用输出
a ===> apple 
b ===> banana 
sour ===> lemon

7. 赋值与变量

7.1 list 给一组变量赋值

功能: 把数组中的值赋给一组变量
语法:

1
list(mixed $var1 \[, mixed $... \] ):array

说明:

  • 像array()一样,这不是真正的函数,而是语言结构。 list()可以在单次操作内就为一组变量赋值。

  • 在PHP7.1.0之前的版本,list()仅能用于数字索引的数组,并假定数字索引从0开始。

  • PHP5里,list()从最右边的参数开始赋值; PHP7里,list()从最左边的参数开始赋值

常用例代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
$info = array('coffee', 'brown', 'caffeine');

// 列出所有变量
list($drink, $color, $power) = $info;
echo "$drink is $color and $power makes it special.\\n";

// 列出他们的其中一个
list($drink, , $power) = $info;
echo "$drink has $power.\\n";

// 或者让我们跳到仅第三个
list( , , $power) = $info;
echo "I need $power!\\n";

// list() 不能对字符串起作用
list($bar) = "abcde";
var_dump($bar); // NULL
?>

嵌套的list代码:

1
2
3
list($a, list($b, $c)) = array(1, array(2, 3));

var_dump($a, $b, $c);

输出:

1
2
3
int(1)
int(2)
int(3)

7.2 compact 创建

功能: 建立一个数组,包括变量名和它们的值
说明: 对每个参数,compact() 在当前的符号表中查找该变量名并将它添加到输出的数组中,变量名成为键名而变量的内容成为该键的值。简单说,它做的事和 extract() 正好相反。返回将所有变量添加进去后的数组。
语法:

1
compact ( mixed $varname1 \[, mixed $... \] ) : array

代码:

1
2
3
4
5
6
7
8
9
10
<?php
$city  = "San Francisco";
$state = "CA";
$event = "SIGGRAPH";

$location_vars = array("city", "state");

$result = compact("event", "nothing\_here", $location\_vars);
print_r($result);
?>

输出:

1
2
3
4
5
6
Array
(
    \[event\] => SIGGRAPH
    \[city\] => San Francisco
    \[state\] => CA
)

7.3 extract 导出为变量

功能: 从数组中将变量导入到当前的符号表
说明:

  • array:一个关联数组。此函数会将键名当作变量名,值作为变量的值。 对每个键/值对都会在当前的符号表中建立变量,并受到 flags 和 prefix 参数的影响。

  • flags

  • EXTR_OVERWRITE : 如果有冲突,覆盖已有的变量

  • EXTR_SKIP: 如果有冲突,不覆盖已有的变量。

  • EXTR_PREFIX_SAME: 如果有冲突,在变量名前加上前缀prefix。

  • EXTR_PREFIX_ALL: 给所有变量名加上前缀 prefix。
    查看更多

语法:

1
extract(array &$array \[, int $flags = EXTR_OVERWRITE \[, string $prefix = NULL \]\]):int

代码:

1
2
3
4
5
6
7
8
9
10
11
12
<?php

/* 假定 $var\_array 是 wddx\_deserialize 返回的数组*/

$size = "large";
$var_array = array("color" => "blue",
                   "size"  => "medium",
                   "shape" => "sphere");
extract($var\_array, EXTR\_PREFIX_SAME, "wddx");

echo "$color, $size, $shape, $wddx_size\\n";
?>

输出:

1
blue, large, sphere, medium

$size 没有被覆盖,因为指定了 EXTR_PREFIX_SAME,这使得 $wddx_size 被建立。如果指定了 EXTR_SKIP,则 $wddx_size 也不会被建立。