Github:30 seconds of php code

Array

  • array_filter: 用回调函数过滤数组中的单元
  • array_reduce:用回调函数迭代地将数组简化为单一的值

展平数组

1
2
3
4
5
6
7
8
9
10
11
12
13
function deepFlatten($items)
{
$result = [];
foreach ($items as $item) {
if (!is_array($item)) {
$result[] = $item;
} else {
$result = array_merge($result, deepFlatten($item));
}
}

return $result;
}

🌰

1
deepFlatten([1, [2], [[3], 4], 5]); // [1, 2, 3, 4, 5]

从左删除 n 个元素

1
2
3
4
function drop($items, $n = 1)
{
return array_slice($items, $n);
}

🌰

1
2
drop([1, 2, 3]); // [2,3]
drop([1, 2, 3], 2); // [3]

数组分组

  • call_user_func: 把第一个参数作为回调函数调用
  • is_string:检测变量是否是字符串
  • is_callable:检测参数是否为合法的可调用结构
  • function_exists:如果给定的函数已经被定义就返回 TRUE
  • is_object:检测变量是否是一个对象
  • isset:检测变量是否已设置并且非 NULL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function groupBy($items, $func)
{
$group = [];
foreach ($items as $item) {
if ((!is_string($func) && is_callable($func)) || function_exists($func)) {
$key = call_user_func($func, $item);
$group[$key][] = $item;
} elseif (is_object($item)) {
$group[$item->{$func}][] = $item;
} elseif (isset($item[$func])) {
$group[$item[$func]][] = $item;
}
}

return $group;
}

🌰

1
groupBy(['one', 'two', 'three'], 'strlen'); // [3 => ['one', 'two'], 5 => ['three']]

返回列表头部

  • reset: 将数组的内部指针指向第一个单元
1
2
3
4
function head($items)
{
return reset($items);
}

🌰

1
head([1, 2, 3]); // 1

返回列表尾部

  • end:将数组的内部指针指向最后一个单元
1
2
3
4
function last($items)
{
return end($items);
}

🌰

1
last([1, 2, 3]); // 3

检索给定键的所有值

  • array_map:为数组的每个元素应用回调函数
1
2
3
4
5
6
function pluck($items, $key)
{
return array_map( function($item) use ($key) {
return is_object($item) ? $item->$key : $item[$key];
}, $items);
}

🌰

1
2
3
4
5
pluck([
['product_id' => 'prod-100', 'name' => 'Desk'],
['product_id' => 'prod-200', 'name' => 'Chair'],
], 'name');
// ['Desk', 'Chair']

过滤指定的值

1
2
3
4
5
function pull(&$items, ...$params)
{
$items = array_values(array_diff($items, $params));
return $items;
}

🌰

1
2
$items = ['a', 'b', 'c', 'a', 'b', 'c'];
pull($items, 'a', 'c'); // $items will be ['b', 'b']

按键排序

  • krsort:对数组按照键名逆向排序
  • ksort:对数组按照键名排序
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function orderBy($items, $attr, $order)
{
$sortedItems = [];
foreach ($items as $item) {
$key = is_object($item) ? $item->{$attr} : $item[$attr];
$sortedItems[$key] = $item;
}
if ($order === 'desc') {
krsort($sortedItems);
} else {
ksort($sortedItems);
}

return array_values($sortedItems);
}

🌰

1
2
3
4
5
6
7
8
9
orderBy(
[
['id' => 2, 'name' => 'Joy'],
['id' => 3, 'name' => 'Khaja'],
['id' => 1, 'name' => 'Raja']
],
'id',
'desc'
); // [['id' => 3, 'name' => 'Khaja'], ['id' => 2, 'name' => 'Joy'], ['id' => 1, 'name' => 'Raja']]

Math

阶乘

1
2
3
4
5
6
7
8
function factorial($n)
{
if ($n <= 1) {
return 1;
}

return $n * factorial($n - 1);
}

最大公约数

1
2
3
4
5
6
7
8
9
function gcd(...$numbers)
{
if (count($numbers) > 2) {
return array_reduce($numbers, 'gcd');
}

$r = $numbers[0] % $numbers[1];
return $r === 0 ? abs($numbers[1]) : gcd($numbers[1], $r);
}

🌰

1
2
gcd(8, 36); // 4
gcd(12, 8, 32); // 4

判断是否为素数

1
2
3
4
5
6
7
8
9
10
11
function isPrime($number)
{
$boundary = floor(sqrt($number));
for ($i = 2; $i <= $boundary; $i++) {
if ($number % $i === 0) {
return false;
}
}

return $number >= 2;
}

🌰

1
isPrime(3); // true

最小公倍数

1
2
3
4
5
6
7
8
9
function lcm(...$numbers)
{
$ans = $numbers[0];
for ($i = 1, $max = count($numbers); $i < $max; $i++) {
$ans = (($numbers[$i] * $ans) / gcd($numbers[$i], $ans));
}

return $ans;
}

栗子

1
2
lcm(12, 7); // 84
lcm(1, 3, 4, 5); // 60

String

  • strstr:查找字符串的首次出现
  • strrpos:计算指定字符串在目标字符串中最后一次出现的位置
  • strlen:获取字符串长度
  • strtolower:将字符串转化为小写
  • strtoupper:将字符串转化为大写

是否字母异位词

1
2
3
4
function isAnagram($string1, $string2)
{
return count_chars($string1, 1) === count_chars($string2, 1);
}

🌰

1
isAnagram('act', 'cat'); // true

是否回文

1
2
3
4
function palindrome($string)
{
return strrev($string) === (string) $string;
}

🌰

1
2
palindrome('racecar'); // true
palindrome(2221222); // true

返回元音字母的个数

1
2
3
4
5
6
function countVowels($string)
{
preg_match_all('/[aeiou]/i', $string, $matches);

return count($matches[0]); // $matches[0]保存的是完整模式的所有匹配
}

首字母转小写

  • lcfirst:使一个字符串的第一个字符小写
1
2
3
4
function decapitalize($string, $upperRest = false)
{
return lcfirst($upperRest ? strtoupper($string) : $string);
}

🌰

1
decapitalize('FooBar'); // 'fooBar'