PHP数组函数的使用

shuffle

用于打乱数组

$arr = [1,2,3,4,5,6,7,8,9,10];
shuffle($arr);
print_r($arr);
Array
(
    [0] => 9
    [1] => 8
    [2] => 5
    [3] => 1
    [4] => 3
    [5] => 4
    [6] => 6
    [7] => 7
    [8] => 2
    [9] => 10
)

current()和end()

输出数组中的当前元素和最后一个元素的值

  • current() - 返回数组中的当前元素的值。
  • next() - 将内部指针指向数组中的下一个元素,并输出。
  • prev() - 将内部指针指向数组中的上一个元素,并输出。
  • reset() - 将内部指针指向数组中的第一个元素,并输出。
  • each() - 返回当前元素的键名和键值,并将内部指针向前移动。

array_flip

键值翻转,注意如果值有重复的情况,不建议用.下标会覆盖

 $arr = [
    9,1,2,3,4
];
$arr = array_flip($arr);
var_dump($arr)
array:5 [
  9 => 0
  1 => 1
  2 => 2
  3 => 3
  4 => 4
]

array_slice

数组切割函数

$arr = [
    'a'=>'a','b'=>'b','c'=>'c','d'=>'d'
];
$arr = array_slice($arr,0,3);
dd($arr);
array:3 [
  "a" => "a"
  "b" => "b"
  "c" => "c"
]

array_chunk

数组分组函数,最后一个元素会分配剩下的元素

$arr = [
    'a'=>'a','b'=>'b','c'=>'c','d'=>'d','e'=>'e'
];
$arr = array_chunk($arr,2);
var_dump($arr);
array:3 [
  0 => array:2 [
    0 => "a"
    1 => "b"
  ]
  1 => array:2 [
    0 => "c"
    1 => "d"
  ]
  2 => array:1 [
    0 => "e"
  ]
]

array_pop

删除数组中最后一个元素

$arr = [
    'a'=>'a','b'=>'b','c'=>'c','d'=>'d','e'=>'e'
];
array_pop($arr);
var_dump($arr);
array:4 [
  "a" => "a"
  "b" => "b"
  "c" => "c"
  "d" => "d"
]

call_user_func

function person($name,$age){
    echo '名字:'.$name.'年龄:'.$age.PHP_EOL;
}
call_user_func('person','ailuoy',11);
名字:ailuoy年龄:11

这个函数可以帮你回调一个函数,并且传参数

call_user_func_array

function person($name,$age){
    echo '名字:'.$name.'年龄:'.$age.PHP_EOL;
}
call_user_func_array('person',['ailuoy',11]);
名字:ailuoy年龄:11

这个和call_user_func差不多,之后后面的传值方式是数组了

call_user_func和call_user_func_array回调类

class foo {
    function bar($arg, $arg2) {
        echo __METHOD__, " got $arg and $arg2\n";
    }
}
$foo = new foo();
call_user_func(array($foo, "bar"),'one','two');
call_user_func_array(array($foo, "bar"), array("three", "four"));
foo::bar got one and two

array_merge+

array_merge合并关联数组不会重组下标

array_merge合并索引数组会重组下标

array+array2

这种即使是关联数组和索引数组都不会重组下标

sprintf

排序

  • sort() 函数用于对数组单元从低到高进行排序。
  • rsort() 函数用于对数组单元从高到低进行排序。
  • asort() 函数用于对数组单元从低到高进行排序并保持索引关系。
  • arsort() 函数用于对数组单元从高到低进行排序并保持索引关系。
  • ksort() 函数用于对数组单元按照键名从低到高进行排序。
  • krsort() 函数用于对数组单元按照键名从高到低进行排序。

回调$foo这个类下的bar方法,并传入参数,最终是 类名::方法名 输出内容

isset in_array array_key_exists的对比

  • isset
  • in_array
  • array_key_exists

循环50W数据,然后判断10W数据是否在50W中

基础数据

for ($i=0;$i<=500000;$i++){
 $arr[] = $i;
}

for ($i=0;$i<=100000;$i++){
 $keys[] = $i;
}

in_array

foreach ($keys as $key => $value) {
    if(in_array($value, $arr)){
        // echo $key;
    }
}
# ailuoy @ MacBook-Pro in ~/Desktop [10:38:20]
$ time php array_key_exists.php
/Users/ailuoy/Desktop/array_key_exists.php:38:
string(4) "done"
php array_key_exists.php  8.41s user 0.18s system 97% cpu 8.841 total

array_key_exists

$arr = array_flip($arr);

foreach ($keys as $key => $value) {
    if(array_key_exists($key, $arr)){
        // echo $key;
    }
}
# ailuoy @ MacBook-Pro in ~/Desktop [10:38:42]
$ time php array_key_exists.php
/Users/ailuoy/Desktop/array_key_exists.php:38:
string(4) "done"
php array_key_exists.php  0.24s user 0.05s system 93% cpu 0.314 total

isset

$arr = array_flip($arr);

foreach ($keys as $key => $value) {
    if(isset($arr[$key])){
        // echo $key;
    }
}
# ailuoy @ MacBook-Pro in ~/Desktop [10:38:51]
$ time php array_key_exists.php
/Users/ailuoy/Desktop/array_key_exists.php:38:
string(4) "done"
php array_key_exists.php  0.17s user 0.06s system 96% cpu 0.238 total

总结

  • isset( 0.17s) > array_key_exists(0.24s) > in_array(8.41s)
  • 但是isset和array_key_exists在这里有场景限制.. 就是你要保证你的value不重复..因为我这里翻转了数组
  • 大数据量的情况下可以考虑isset和array_key_exists

array_walk

$array = [1, 2, 3, 4];
$dd = [];
array_walk($array, function ($value) use (&$dd) {
    if ($value > 2) {
        $dd[] = $value;
    }
});
var_dump($dd);

匿名函数

function getCounter (){
    $i = 0;
    return function () use($i) {
        echo ++$i;
    };
}
$counter = getCounter();
$counter();
$counter();

$arr1 = [1,2];
$arr2 = [1,4];
$change2 = array_diff($arr2,array_diff($arr2,$arr1));//[1],arr2中的值不在arr1,就删除arr2中的值
$change1 = array_merge($arr1,array_diff($arr2,$arr1));//[1,2,4],arr2中的值不在arr1中,就加入到arr1
dd($change2,$change1);