做爲一門 Web 開發語言,PHP 無疑是成功的:php
今天,咱們先從 PHP 的函數提及,用好這些系統內置函數,讓你的開發效率事半功倍。數據庫
相信不少 PHPer 對這個函數並不陌生,這個函數就是取數組中的某一列,如json
$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);
複製代碼
結果爲數組
Array
(
[0] => John
[1] => Sally
[2] => Jane
[3] => Peter
)
複製代碼
若是咱們須要提取last_name
,並用相應的id
做爲鍵值,應該怎麼實現呢?你可能想到了foreach
循環,但用array_column()
能夠一行代碼搞定:bash
$last_names = array_column($records, 'last_name', 'id');
print_r($last_names);
複製代碼
輸出結果:閉包
Array
(
[2135] => Doe
[3245] => Smith
[5342] => Jones
[5623] => Doe
)
複製代碼
咱們還能夠將每一個用戶的 ID 做爲$records
的key
從新生成索引數組app
$idRecords = array_column($records, null, 'id');
print_r($idRecords);
複製代碼
結果爲:ide
Array
(
[2135] => Array
(
[id] => 2135
[first_name] => John
[last_name] => Doe
)
[3245] => Array
(
[id] => 3245
[first_name] => Sally
[last_name] => Smith
)
[5342] => Array
(
[id] => 5342
[first_name] => Jane
[last_name] => Jones
)
[5623] => Array
(
[id] => 5623
[first_name] => Peter
[last_name] => Doe
)
)
複製代碼
<?php
class User {
public $username;
public function __construct(string $username) {
$this->username = $username;
}
}
$users = [
new User('user 1'),
new User('user 2'),
new User('user 3'),
];
print_r(array_column($users, 'username'));
複製代碼
結果爲:函數
Array
(
[0] => user 1
[1] => user 2
[2] => user 3
)
複製代碼
array_filter()
將刪除 array 中全部等值爲 FALSE
的條目。學習
var_dump(array_filter([0, 0.0, '0', '', false, null, [], true, 123, '1']));
複製代碼
結果爲:
array(3) {
[7] =>
bool(true)
[8] =>
int(123)
[9] =>
string(1) "1"
}
複製代碼
若是使用回調函數,咱們還能夠作更多的事:
<?php
$employees = [
[
'name' => 'John',
'age' => 45,
'language' => 'Python'
],
[
'name' => 'Robbin',
'age' => 25,
'language' => 'Golang'
],
[
'name' => 'Smith',
'age' => 35,
'language' => 'PHP'
],
[
'name' => 'Steven',
'age' => 29,
'language' => 'C#'
]
];
$fireList = array_filter(
$employees,
function ($employee, $key) use (&$employees) {
return $employee['age'] > 35;
},
ARRAY_FILTER_USE_BOTH
);
print_r($fireList);
複製代碼
注意:用戶不該在回調函數中修改數組自己。例如增長/刪除單元或者對
array_filter()
正在做用的數組進行unset
。若是數組改變了,此函數的行爲將不可預測。
經過array_map()
,咱們能夠經過預設的函數對數組元素進行批量處理
function cube($n) {
return($n * $n * $n);
}
$a = array(1, 2, 3, 4, 5);
$b = array_map("cube", $a);
print_r($b);
複製代碼
$b
將輸出
Array
(
[0] => 1
[1] => 8
[2] => 27
[3] => 64
[4] => 125
)
複製代碼
從PHP 5.3起,咱們也能夠將調用的函數寫做閉包的形式:
$b = array_map(
function ($n) {
return($n * $n * $n);
},
$a
);
複製代碼
一樣的,咱們還可使用系統內置的函數來處理一些數據,如:
$values = ['say', ' bye', '', ' to', ' spaces ', ' '];
$result = array_map('trim', $values);
複製代碼
array_map()
也能夠在類中使用,如下是在類中的調用方法
// Static outside of class context
array_map( array( 'ClassName', 'methodName' ), $array );
// Static inside class context
array_map( array( __CLASS__, 'methodName' ), $array );
array_map( array( 'self', 'methodName' ), $array );
// Non-static outside of object context
array_map( array( $object, 'methodName' ), $array );
// Non-static inside of object context
array_map( array( $this, 'methodName' ), $array );
複製代碼
求 1 ~ 100 的和:
<?php
$hunder = range(1, 100);
$sum = array_reduce(
$hunder,
function ($carry, $item) {
$carry += $item;
return $carry;
}
);
echo $sum;
複製代碼
array_walk()
可讓咱們便捷的修改數組內的元素:
$infos = [
['uid' => 1, 'email' => 'jack@example.com'],
['uid' => 2, 'email' => 'rose@example.com']
];
array_walk(
$infos,
function (&$info) {
$info['username'] = strstr($info['email'], '@', true);
unset($info['email']);
}
);
echo json_encode($infos); // [{"uid":1,"username":"jack"},{"uid":2,"username":"rose"}]
複製代碼
把任意維度的數組轉換成一維數組
$user = [
'a' => [100, 'a1'],
'b' => [101, 'a2'],
'c' => [
'd' => [102, 'a3'],
'e' => [103, 'a4']
]
];
function array_flat($arr) {
$result = [];
array_walk_recursive($arr, function ($value) use (&$result) {
array_push($result, $value);
});
return $result;
}
print_r(array_flat($user));
複製代碼
// 驗證郵箱
var_dump(filter_var('username@example.com', FILTER_VALIDATE_EMAIL)); // 有效輸出email地址,無效輸出false
// 驗證 IPv4
var_dump(filter_var('8.8.8.8', FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)); // 有效輸出IP,無效輸出false
// 驗證 IPv6
var_dump(filter_var('2001:4860:4860::8888', FILTER_VALIDATE_IP, FILTER_FLAG_IPV6)); // 有效輸出IP,無效輸出false
// 驗證非私網 IP
var_dump(filter_var('10.0.0.1', FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE)); // 非私網輸出IP,不然輸出false
var_dump(filter_var('192.0.0.1', FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE));
// 驗證非保留 IP
var_dump(filter_var('8.8.8.8', FILTER_VALIDATE_IP, FILTER_FLAG_NO_RES_RANGE)); // // 非保留IP輸出IP,不然輸出false
var_dump(filter_var('127.0.0.1', FILTER_VALIDATE_IP, FILTER_FLAG_NO_RES_RANGE));
var_dump(filter_var('0.0.0.0', FILTER_VALIDATE_IP, FILTER_FLAG_NO_RES_RANGE));
var_dump(filter_var('169.254.0.0', FILTER_VALIDATE_IP, FILTER_FLAG_NO_RES_RANGE));
var_dump(filter_var('255.255.255.255', FILTER_VALIDATE_IP, FILTER_FLAG_NO_RES_RANGE));
var_dump(filter_var('::1', FILTER_VALIDATE_IP, FILTER_FLAG_NO_RES_RANGE));
var_dump(filter_var('2002', FILTER_VALIDATE_IP, FILTER_FLAG_NO_RES_RANGE));
// 驗證 Mac 地址
var_dump(filter_var('F1:5C:89:A4:40:49', FILTER_VALIDATE_MAC)); // 有效輸出地址,無效輸出 false
// 驗證布爾值
var_dump(filter_var('1', FILTER_VALIDATE_BOOLEAN)); // 1, true, on ,yes 返回 true,不然返回 false
// 驗證浮點數
var_dump(filter_var('1234.233', FILTER_VALIDATE_FLOAT)); // 有效輸出浮點數,無效輸出 false
var_dump(filter_var('1,234.233', FILTER_VALIDATE_FLOAT, FILTER_FLAG_ALLOW_THOUSAND));
複製代碼
經過array_multisort()
,可讓咱們像操做 Excel 同樣對數據進行排序操做,咱們先來看一個簡單的例子
$ar1 = array(10, 100, 100, 0);
$ar2 = array(1, 3, 2, 4);
array_multisort($ar1, $ar2);
var_dump($ar1);
var_dump($ar2);
複製代碼
這個例子裏,排序後,第一個數組會包含 0、 十、 100、 100。 第二個數組會包含 四、一、 二、 3。 第二個數組裏的項目對應第一個數組後也進行了排序(100 和 100)。
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)
}
複製代碼
如今數據表中存儲着以下的數據:
volume | edition
-------+--------
67 | 2
86 | 1
85 | 6
98 | 2
86 | 6
67 | 7
複製代碼
咱們將 volume 降序排列,把 edition 升序排列
$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 = array_column($data, 'volume');
$edition = array_column($data, 'edition');
// 將數據根據 volume 降序排列,根據 edition 升序排列
// 把 $data 做爲最後一個參數,以通用鍵排序
array_multisort($volume, SORT_DESC, $edition, SORT_ASC, $data);
複製代碼
數據集合如今排好序了,結果以下:
volume | edition
-------+--------
98 | 2
86 | 1
86 | 6
85 | 6
67 | 2
67 | 7
複製代碼
這個應該都很熟悉,就是將兩個數組合並:
$array1 = array("color" => "red", 2, 4);
$array2 = array("a", "b", "color" => "green", "shape" => "trapezoid", 4);
print_r(array_merge($array1, $array2));
複製代碼
輸出
Array
(
[color] => green
[0] => 2
[1] => 4
[2] => a
[3] => b
[shape] => trapezoid
[4] => 4
)
複製代碼
⚠️:若是合併的數組中包含了關聯數組,則相同鍵名元素會覆蓋,且合併後的數組保留原鍵名。如果索引數組,則會從新生成索引。
同名關聯數組被覆蓋:
$array1 = array("color" => "red");
$array2 = array("color" => "green", "shape" => "trapezoid");
print_r(array_merge($array1, $array2));
複製代碼
輸出
Array
(
[color] => green
[shape] => trapezoid
)
複製代碼
同名索引數組從新索引:
$array1 = array(2, 4);
$array2 = array("a", "b", 4);
print_r(array_merge($array1, $array2));
複製代碼
輸出
Array
(
[0] => 2
[1] => 4
[2] => a
[3] => b
[4] => 4
)
複製代碼
還有另外一種合併數組的方式:+
運算符,這種方式能夠徹底保留原有數組並將新的數組附加到後面。在兩個數組中存在相同的鍵名時,第一個數組中的同鍵名的元素將會被保留,第二個數組中的元素將會被忽略
$array1 = array(0 => 'zero_a', 2 => 'two_a', 3 => 'three_a');
$array2 = array(1 => 'one_b', 3 => 'three_b', 4 => 'four_b');
$result = $array1 + $array2;
print_r($result);
複製代碼
輸出
Array
(
[0] => zero_a
[2] => two_a
[3] => three_a
[1] => one_b
[4] => four_b
)
複製代碼
將相同 key
的不一樣數組中信息進行合併:
<?php
$baseInfo = [
'jack' => [
'age' => 22,
'tel' => '56710937'
],
'rose' => [
'age' => 21,
'tel' => '578391038'
]
];
$extInfo = [
'jack' => [
'addrs' => 'NYC'
],
'rose' => [
'addrs' => 'London'
]
];
echo json_encode(array_merge_recursive($baseInfo, $extInfo));
複製代碼
輸出:
{
"jack":{
"age":22,
"tel":"56710937",
"addrs":"NYC"
},
"rose":{
"age":21,
"tel":"578391038",
"addrs":"London"
}
}
複製代碼
生成指定區間的數組
range(0, 100);
複製代碼
指定步長爲 10
range(1, 100, 10); // [0,10,20,30,40,50,60,70,80,90,100]
複製代碼
若是起始值大於結束值,則會按照遞減的順序生成
range(100, 0, 10); // [100,90,80,70,60,50,40,30,20,10,0]
複製代碼
三個參數也能夠是浮點數
range(12.8, 2.2, 2.5); // [12.8, 10.3, 7.8, 5.3, 2.8]
複製代碼
$start
和 $end
若是所有是字符串,那麼會取兩個字符串的第一個字母,並按照 ASCII 字母順序表,取步長對應的值
range('a', 'i'); // ["a","b","c","d","e","f","g","h","i"]
複製代碼
那麼,咱們如何使用range()
來輸出 ASCII 的全部可見字符呢?,這在PHP中很是簡單:
range(' ', '~');
複製代碼
若是咱們須要將一個數組拆分爲多個數組,就能夠經過array_chunk()
快速實現:
<?php
$input_array = array('a', 'b', 'c', 'd', 'e');
echo json_encode(array_chunk($input_array, 2)),PHP_EOL;
echo json_encode(array_chunk($input_array, 2, true));
// [["a","b"],["c","d"],["e"]]
// [["a","b"],{"2":"c","3":"d"},{"4":"e"}]
複製代碼
如今有兩個數組,咱們但願一個數組的元素作key
,另外一個數組的元素作value
,合併爲一個數組:
$a = array('green', 'red', 'yellow');
$b = array('avocado', 'apple', 'banana');
$c = array_combine($a, $b);
echo json_encode($c);
// {"green":"avocado","red":"apple","yellow":"banana"}
複製代碼
若是須要求數組元素的差集/交集,可使用array_diff($array1, $array2[,$arrayn])
,這將返回存在於$array1
中而不存在其餘 array 中值。
<?php
$array1 = array("a" => "green", "red", "blue", "red");
$array2 = array("b" => "green", "yellow", "red");
$diff = array_diff($array1, $array2);
$intersect = array_intersect($array1, $array2);
echo json_encode($diff); // {"1":"blue"}
echo json_encode($diff); // {"a":"green","0":"red","2":"red"}
複製代碼
顧名思義,使用鍵名計算數組的差集/交集,一樣是返回存在於$array1
中而不存在與其餘$array
中的值。
該函數會將鍵名與元素都做爲比較條件。
默認狀況下,在第一個版本低於第二個時,version_compare() 返回 -1;若是二者相等,返回 0;第二個版本更低時則返回 1。(相似於太空操做符)))
echo version_compare('5.3.0', '7.1.4'); // -1
複製代碼
該函數用於格式化數字,能實現
$num = 123456.789;
echo number_format($num),PHP_EOL;
echo number_format($num, 2),PHP_EOL;
echo number_format($num, 1, ',', '/'),PHP_EOL;
複製代碼
tirm()
能夠去除字符串首尾處的空白字符(或者其餘字符),若是沒有指定待刪除的字符列表,則會刪除如下字符:
一般狀況下,咱們都會指定刪除的字符列表
trim('@apple……', '@#¥%……'); // apple
複製代碼
tips: 該函數與array_map()
同時服用,效果更佳。