range($start, $end, $step = 1) 使用连续整数填充一个数组,可以通过修改$step改变填充间隔
array_splice($array, $offset, $length)
in_array($search, $arr, true); 当查找的数据量较少时候,使用in_array,当数据量较大时,使用array_filp()将数组键值对反转,通过isset结构判断,有更好的性能,使用in_arry是线性时间,而关联数组是常量时间
$search = []; // 数据量 for ($n = 1000; $n >= 1; $n--) { $search[] = random_int(1, 999999); } $list = range(1, 9999999, 1); $start = microtime(true); foreach ($search as $v) { in_array($v, $list, true); } echo "in_array 耗时 " . (microtime(true) - $start) . 's' . PHP_EOL; $start = microtime(true); $list = array_flip($list); foreach ($search as $v) { if (isset($list[$v])) { } } echo "isset 耗时 " . (microtime(true) - $start) . 's' . PHP_EOL;一般来说,php内置函数性能要优于用户代码,很少情况不是,array_filter()就属于比较特殊的,建议,如果是数据量较大的操作,能用array_filter和foreach完成,优先选用foreach
$res = []; $list = range(1, 1000000, 1); $start = microtime(true); foreach ($list as $v) { if (0 === $v % 9765) { $res[] = $v; } } echo "foreach 耗时 " . (microtime(true) - $start) . 's' . PHP_EOL; $start = microtime(true); $res = array_filter($list, function ($v) { return 0 === $v % 9765; }); echo "array_filter 耗时 " . (microtime(true) - $start) . 's' . PHP_EOL;实际上,引用循环的速度可能比普通循环还要慢,其次,如果引用循环使用以后,未及时释放变量,会导致一些意外的结果
$a1 = [1, 2, 3]; $b1 = [4, 5, 6]; foreach ($a1 as &$v) {} // unset($v); // 这里需要释放引用使用的变量 foreach ($b1 as $v) {} print_r($a1); print_r($b1);usort()函数的替代函数 array_sort() 缓存比较值,排序元素超过10个时候,array_sort速度会更快
function array_sort(array $array, callable $callback, string $sort = 'asc'): array { $mapped = array_map($callback, $array); if ('asc' === $sort) { asort($mapped); } else { arsort($mapped); } $res = []; foreach ($mapped as $k => $v) { $res[] = $array[$k]; } return $res; } // 以字符串长度排序 $a = ['xxxx', 'a', 'b', 'abcdec', '342usfd']; $arr = array_sort($a, static function ($item) { return mb_strlen($item); }); print_r($arr);