【整理】php数组的相关处理函数

一、键、值操作函数

1、array_values($contact):

不保留键名,按照索引,对数组排列


2、array_keys($contact, '可选参数', '可选参数true/false'):

若设置可选参数,则按照可选参数返回键名,若不设置,直接返回数组的键名,false为不依赖默认参数类型


3、in_array('value', '$contact', '可选参数true/false'):

检查数组中是否存在某值, true类型必须完全一致,搜索值若为字符串,设置true后,则区分大小


4、array_search(value, array, '可选参数true/false'):

array_search()函数与in_array()一样,在数组中查找一个键值。如果找到了该值,则返回匹配该元素所对应的键名。如果没找到,则返回 false。注意在 PHP 4.2.0 之前,函数在失败时返回 null 而不是 false。同样如果第三个参数被指定为true,则只有在数据类型和值都一致时才返回相应元素的键名。


5、array_key_exists(key, array):

判断某个数组array中是否存在指定的key,如果该key存在,则返回true,否则返回false


6、array_flip($contact):

array_flip()返回一个反转后的array。该函数会将数组的键名和元素值互换,如果一个值多次出现,最后一个键名为它的值。

例如 $contact中的 键名 变成了 值,而 $contact中的 值 则变成了 键名。

注意:$contact中的值需要能够作为合法的键名,例如 需要是 integer 或者 string。如果值的类型不对将发出一个警告,并且有问题的键/值对将不会反转。如果同一个值出现了多次,则最后一个键名将作为它的值,所有其它的都丢失了。

该函数适用场景举例:可用作去重


7、array_reverse($contact, '可选参数true/false'):

将数组顺序翻转,true保持键名不变。

array_reverse()接受数组 $contact 作为输入 并返回一个单元为相反顺序的新数组,如果 第二个参数为true 则保留原来的键名。如果为false 则键名丢失


8、array_column(input, column_key, index_key):

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

参数:

    input:需要取出数组列的多维数组。 如果提供的是包含一组对象的数组,只有 public 属性会被直接取出。 为了也能取出 private 和 protected 属性,类必须实现 __get() 和 __isset() 魔术方法。


    column_key:需要返回值的列,它可以是索引数组的列索引,或者是关联数组的列的键,也可以是属性名。 也可以是null,此时将返回整个数组(配合index_key参数来重置数组键的时候,非常管用)


    index_key:作为返回数组的索引/键的列,它可以是该列的整数索引,或者字符串键值。


返回值:

从多维数组中返回单列数组。


9、compact(var1, var2...)

创建一个包含变量名和它们的值的数组。

compact()函数 创建一个由参数所带变量组成的数组。 如果参数中存在数组,该数组中变量的值也会被获取。 本函数返回的数组是一个关联数组,键名为函数的参数,键值为参数中变量的值。 本函数执行的行为与extract() 正好相反

<?php

//创建一个包含变量名和它们的值的数组:
$firstname = "Peter";
$lastname = "Griffin";
$age = "41";
 
$result = compact("firstname", "lastname", "age");
 
print_r($result);
输出:Array ( [firstname] => Peter [lastname] => Griffin [age] => 41 )
 
 
 
//使用没有对应变量名的字符串,以及一个变量名数组:
<?php
$firstname = "Peter";
$lastname = "Griffin";
$age = "41";
 
$name = array("firstname", "lastname");
$result = compact($name, "location", "age");
 
print_r($result);
输出:Array ( [firstname] => Peter [lastname] => Griffin [age] => 41 )

二、数组元素个数有关的函数

1、count($contact, '可选参数0/1'):

统计数组的元素个数,可选参数表示是否递归的检测多维数组,0为不检测,1为检测


2、array_count_values($contact):

统计数组元素出现的次数,输出数组,键名为元素值,值为键名出现次数


3、array_unique($contact):

删除数组中的重复元素值,重复的元素,键名保留第一个元素的键名

三、使用回调函数处理数组的函数

1、array_filter(array $array [, callable $callback [, int $mode = 0 ]] )

用回调函数过滤数组中的元素

依次将 array 数组中的每个值传递到 callback 函数。如果 callback 函数返回 true,则 array 数组的当前值会被包含在返回的结果数组中。数组的键名保留不变。


参数:

    array:要循环遍历的数组

    callback:使用的回调函数。如果没有提供 callback 回调函数,将删除 array 数组中的所有“空”元素。 有关 PHP 如何判定“空”元素,请参阅 empty() 。

    mode:决定callback接收的参数形式,如下:

            ①、ARRAY_FILTER_USE_KEY - 将键名作为 callback 回调的唯一参数,而不是值

            ②、ARRAY_FILTER_USE_BOTH - 将值和键都作为参数传递给 callback 回调,而不是仅传递值

    默认值为 0,只传递值作为 callback 回调的唯一参数。


返回值:

返回过滤后的数组。


2、array_map('回调函数',$contact, '之后可选参数数组$contact1'):

  • array_map()函数 将用户自定义函数作用到数组中的每个值上,并返回用户自定义函数作用后的带有新值的数组,若函数作用后无返回值,则对应的新值数组中为空。

  • 回调函数 接受的参数数量 应该和传递给 array_map() 函数的数组数量一致。

  • 您可以向函数输入一个或者多个数组。若向函数输入2个数组,其回调函数参数也应该有两个,map给函数传值时,是每次从两个数组中分别取一个传给函数。即多个数组之间是同步提交的,不是提交完一个数组再提交下一个。

语法:array array_map ( callable callback,arrayarr1 [, array $… ] )

<?php

//单数组形式
function myfunction($v)
{
    if($v==="Dog")
    {
        return "Fido";
    }

    return $v;
}

$a = array("Horse","Dog","Cat");
print_r(array_map("myfunction", $a));

//多数组形式
function myfunction1($v1,$v2)
{
    if($v1===$v2)
    {
        return "same";
    }

    return "different";
}

$a1 = array("Horse", "Dog", "Cat");
$a2 = array("Cow", "Dog", "Rat");
print_r(array_map("myfunction1", $a1, $a2));


3、array_walk(array|object &$array, callable $callback, mixed $arg = null): bool

使用 用户自定义函数 对数组中的每个 元素 做回调处理。在函数中,数组的键名和键值是参数。


您可以通过把用户自定义函数中的第一个参数指定为引用:&$value,来改变数组元素的值。这样任何对这些元素的改变也将会改变原始数组本身。

提示:如需操作更深的数组(一个数组中包含另一个数组),请使用 array_walk_recursive() 函数。


array_walk()函数 对数组中的每个元素应用回调函数。如果成功则返回 true,否则返回 false。


典型情况下 myfunction 接受两个参数。array 参数的值作为第一个,键名作为第二个。如果提供了可选参数 arg,将被作为第三个参数传递给回调函数。


如果 myfunction 函数 需要的参数比给出的多,则每次 array_walk() 调用 myfunction 时都会产生一个 E_WARNING 级的错误。这些警告可以通过在 array_walk() 调用前加上 PHP 的错误操作符 @ 来抑制,或者用 error_reporting()。

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

输出结果如下:

Before ...:
d. lemon
a. orange
b. banana
c. apple
 ... and after:
d. fruit: lemon
a. fruit: orange
b. fruit: banana
c. fruit: apple


4、array_map与array_walk区别:

  • map 主要是为了得到你的回调函数处理后的新数组,要的是结果

  • walk 主要是对每个参数都使用一次你的回调函数,要的是处理的过程

  • walk 可以认为提供额外参数给回调函数,map不可以

  • walk 主要是要对数组内的每个值进行操作,操作结果影响原来的数组

  • map 主要是对数组中的值进行操作后返回数组,以得到一个新数组

  • walk 可以没有返回值 map要有,因为要填充数组

四、数组的排序函数

1、sort()和rsort()

数组内部元素从小到大排序

数组内部元素从大到小排序


2、ksort()和krsort()

根据键名对数组排序

按照键名从小到大排序

按照键名从大到小排序


3、asort()和arsort()

按照元素值排序,保留键名


4、natsort()和natcasesort()

根据自然排序法对数组排序,按照数字从1到9,字母从a到z的排序方法,前者忽略键名,后者保留键名,并且前者区分大小写,后者不区分大小写


5、usort()

使用 用户自定义的比较函数 对数组中的值进行排序。

usort排序函数的返回值老是记不住返回1的时候是按升序还是降序排?网上搜了一大堆也没个能说明白的。 直到今天看到了一个说法:


    usort函数执行的时候,会依次把$a中的两个值 传递给名字为my_sort函数中,所以你会看到my_sort有两个形参,然后php会判断my_sort函数的返回值:

        如果为0,则位置不变

        如果为-1,则$a位置和$b不变

        如果为1,则$a位置和$b互换

所以我们只需要根据 我们自定义函数 返回的是-1 还是 1 来记,返回1,则表示usort函数会帮我们交换a和b 的位置。返回-1 则不交换 a和b 的位置。

<?php

/******以下是进行降序排序******/

$arr = [1,6,5,3,4,2];

//我们这里在 a < b 的时候返回1,表示我们希望a < b 的时候usort函数帮我们交换a,b ,交换后 a和b的大值就会出现在前面。从而达到降序排列数组的目的。
usort($arr, function($a, $b) {
    return $a < $b ? 1 : -1;
});

print_r($arr);

//输出如下:
Array
(
    [0] => 6
    [1] => 5
    [2] => 4
    [3] => 3
    [4] => 2
    [5] => 1
)





/******以下是进行升序排序******/
$arr = [1,6,5,3,4,2];

//a小于b的时候返回-1,说明a < b的时候不需要交换。说明最后是按升序排序。
usort($arr, function ($a, $b) {
    return $a < $b ? -1 : 1;
});

print_r($arr);

//输出如下:
Array
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 4
    [4] => 5
    [5] => 6
)


6、uksort()

使用 用户自定义的比较函数 对数组中的键名进行排序。


7、array_multisort()

<?php

//下面的两个例子对二维数组进行排序



/******用法一:不需要遍历数组就可以对二维数组排序******/
$data = [
    ['a' => 23, 'b' => 'hhhh', 'c' => '2013-12-23'],
    ['a' => 26, 'b' => 'hkkk', 'c' => '2013-12-26'],
    ['a' => 20, 'b' => '565', 'c' => '2013-12-28'],
    ['a' => 29, 'b' => 'fhj', 'c' =>' 2013-11-23'],
    ['a' => 10, 'b' => 'fffff', 'c' => '2013-12-24'],
];

// 取'a'列数据进行升序排列
array_multisort(array_column($data, 'a'),SORT_ASC, $data);

print_r($data);

//输出结果如下:
Array
(
    [0] => Array
    (
        [a] => 10
        [b] => fffff
        [c] => 2013-12-24
    )

    [1] => Array
    (
        [a] => 20
        [b] => 565
        [c] => 2013-12-28
    )

    [2] => Array
    (
        [a] => 23
        [b] => hhhh
        [c] => 2013-12-23
    )

    [3] => Array
    (
        [a] => 26
        [b] => hkkk
        [c] => 2013-12-26
    )

    [4] => Array
    (
        [a] => 29
        [b] => fhj
        [c] =>  2013-11-23
    )
)


    
    
/******用法二:通常用法******/
$data = [
    ['volume' => 67, 'edition' => 2],
    ['volume' => 86, 'edition' => 1],
    ['volume' => 85, 'edition' => 6],
    ['volume' => 98, 'edition' => 2],
    ['volume' => 86, 'edition' => 6],
    ['volume' => 67, 'edition' => 7],
];

$volume = [];
$edition = [];

foreach($data as $key => $row)
{
    $volume[$key] = $row['volume'];
    $edition[$key] = $row['edition'];
}

array_multisort($volume,SORT_DESC, $edition,SORT_ASC, $data);

print_r($data);

//输出结果如下:
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
    )
)


8、shuffle($arr)

函数把数组中的元素按随机顺序重新排列。若成功,则返回 true,否则返回 false。

注释:本函数为数组中的单元赋予新的键名。这将删除原有的键名而不仅是重新排序。

<?php

$my_array = array("a" => "Dog", "b" => "Cat", "c" => "Horse");

shuffle($my_array); print_r($my_array);

输出:
Array ( [0] => Cat [1] => Horse [2] => Dog )


9、array_rand($array, $number)

array_rand()函数 从数组中随机选出一个或多个元素,并返回。

第二个参数用来确定要选出几个元素。如果选出的元素只有一个,返回该元素的键名(注意是键名不是键值)。

注释:如果指定array_rand()函数选取的元素个数大于1,那么不管抽取的是数字索引数组还是关联数组,都将取得原数组的key(注意是key),并放在一个新的索引数组中。

$a = array("a" => "Dog", "b" => "Cat", "c" => "Horse");
print_r(array_rand($a,1));

输出:
b
 
 
$a=array("a" => "Dog", "b" => "Cat", "c" => "Horse");
print_r(array_rand($a,2));
 
输出:
Array ( [0] => c [1] => b )

五、拆分,合并,分解,结合数组

1、array_slice($contact, '取出元素的初始值',  '可选择参数:取出元素的长度', '可选择参数:true/false'):

取出元素的初始值若为正值,则从前往往后取,负数则从前向后取,最后一个元素为-1,则从负数值开始往后取。true将保留键名


2、array_splice($contact, '删除元素的初始值', '删除元素的长度', '可选参数:替换数组'):

初始值如果是正数,则从此值开始删除,负数跟slice()同理,如设置替换数组,则将替换数组插入删除的位置。


3、array_combine($contact1, $contact2):

创建一个数组,用第一个数组元素的值作为其键名,第二个数组元素的值作为其值


4、array_merge($contact1, $contact2, [,...]):

第一个参数为必选参数,仅有一个会以索引数组的形式输出。多个数组合并,键名重复,后面的会覆盖前面的。

然后再说一下 数组的 + 加号运算符 和 array_merge的区别在于:遇到相等key时,用+时,左边数组会覆盖掉右边数组的值,array_merge相反,后面的数组覆盖掉前面的


5、array_intersect($contact1, $contact2, [,...]):

数组的交集,键名不变,仅数组值进行比较,输出第一个数组中 二者共同有的

<?php

$a1 = array("a" => "red", "b" => "green", "c" => "blue", "d" => "yellow");
$a2 = array("e" => "red", "f" => "green", "g" => "blue");

$result=array_intersect($a1, $a2);

print_r($result);
#输出:Array ( [a] => red [b] => green [c] => blue )





$a1 = array("a" => "red" , "b" => "green", "c" => "blue", "d" => "yellow");
$a2 = array("e" => "red" , "f" => "black", "g" => "purple");
$a3 = array("a" => "red" , "b" => "black", "h" => "yellow");

$result=array_intersect($a1, $a2, $a3);

print_r($result);
#输出:Array ( [a] => red )


6、array_diff($contact1, $contact2, $contact3):

数组的差集,第一个数组和第二个参数为必选的参数,第三个参数乃至于以后可选,输出第一个数组中有,其他数组没有的值

<?php
$a1 = array("a" => "red", "b" => "green", "c" => "blue", "d" => "yellow");
$a2 = array("e" => "red", "f" => "green", "g" => "blue");

$result = array_diff($a1, $a2);

print_r($result);
# 输出:Array ( [d] => yellow )


$a1 = array("a" => "red", "b" => "green", "c" => "blue", "d" => "yellow");
$a2 = array("e" => "red", "f" => "black", "g" => "purple");
$a3 = array("a" => "red", "b" => "black", "h" => "yellow");

$result = array_diff($a1, $a2, $a3);

print_r($result);
# 输出:Array ( [b] => green [c] => blue )

六、获取数组中第一个元素或最后一个元素

1、第一种情况(从数组中取出,则数组不在存在)

$first = array_shift($arr);

$last = array_pop($arr);


2、第二种情况(从数组中取出,数组中还存在)

$first = current($arr);  或 $first = reset($arr);

$last = end($arr) ;  或 $last = array_slice($arr, -1, 1);



声明:禁止任何非法用途使用,凡因违规使用而引起的任何法律纠纷,本站概不负责。

小周博客
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

精彩评论

全部回复 0人评论 7,777人参与

loading