常用鍵值快速獲取
$keys = array_keys($arr); // 所有鍵名
$values = array_values($arr); // 所有鍵值
$reversed = array_reverse($arr); // 顛倒,不保留鍵名
$reversedKeyed = array_reverse($arr, true); // 顛倒,保留鍵名
$blueKeys = array_keys($arr, 'blue'); // 值為 'blue' 的鍵名
1. 二維數組去重(array_unique 只支持一維)
function array2dUnique($array2D, $keepFirstKeys = false, $keepSubKeys = true) {
// 保留一級鍵
$firstKeys = $keepFirstKeys ? array_keys($array2D) : null;
// 保留二級鍵(假設所有子數組鍵名相同)
$subKeys = $keepSubKeys ? array_keys(end($array2D)) : null;
// 降維:子數組 → 逗號分隔字符串
foreach ($array2D as $v) {
$temp[] = implode(',', $v);
}
// 去重
$temp = array_unique($temp);
// 重組
foreach ($temp as $k => $v) {
if ($keepFirstKeys) $k = $firstKeys[$k];
if ($keepSubKeys) {
$parts = explode(',', $v);
foreach ($parts as $sk => $sv) {
$output[$k][$subKeys[$sk]] = $sv;
}
} else {
$output[$k] = explode(',', $v);
}
}
return $output;
}
// 測試
$data = [
'first' => ['title' => '1111', 'date' => '2222'],
'second' => ['title' => '1111', 'date' => '2222'], // 重複
'third' => ['title' => '2222', 'date' => '3333'],
];
print_r(array2dUnique($data, true));
/*
Array
(
[first] => Array ( [title] => 1111 [date] => 2222 )
[third] => Array ( [title] => 2222 [date] => 3333 )
)
*/
2. 二維數組多欄位排序(array_multisort 封裝)
function array2dSort($array, $sortRules) {
// $sortRules = [
// ['key' => 'name', 'order' => SORT_ASC, 'type' => SORT_STRING],
// ['key' => 'size', 'order' => SORT_DESC, 'type' => SORT_NUMERIC],
// ];
if (!is_array($array)) return $array;
$args = [];
foreach ($sortRules as $rule) {
$col = array_column($array, $rule['key']);
$args[] = $col;
$args[] = $rule['order'] ?? SORT_ASC;
$args[] = $rule['type'] ?? SORT_REGULAR;
}
$args[] = &$array; // 最後引用原數組
call_user_func_array('array_multisort', $args);
return $array;
}
// 示例
$arr = [
['name' => '學習', 'size' => '1235', 'type' => 'jpg', 'time' => '1921-11-13'],
['name' => '中國功夫', 'size' => '153', 'type' => 'jpg', 'time' => '2005-11-13'],
['name' => '編程', 'size' => '35', 'type' => 'gif', 'time' => '1997-11-13'],
['name' => '中國功夫', 'size' => '65', 'type' => 'jpg', 'time' => '1925-02-13'],
['name' => '中國功夫', 'size' => '5', 'type' => 'ico', 'time' => '1967-12-13'],
];
$sorted = array2dSort($arr, [
['key' => 'name', 'order' => SORT_ASC, 'type' => SORT_STRING],
['key' => 'type', 'order' => SORT_DESC, 'type' => SORT_STRING],
['key' => 'size', 'order' => SORT_ASC, 'type' => SORT_NUMERIC],
]);
3. 多維數組降維為一維
function arrayFlatten($array, &$result = []) {
foreach ($array as $value) {
if (is_array($value)) {
arrayFlatten($value, $result);
} else {
$result[] = $value;
}
}
return $result;
}
// 測試
$arr = ['123.html', '456.html', ['dw.html', 'fl.html', ['ps.html', 'fw.html']], 'ab.html'];
print_r(arrayFlatten($arr));
// Array ( [0] => 123.html [1] => 456.html [2] => dw.html [3] => fl.html [4] => ps.html [5] => fw.html [6] => ab.html )
4. 遞歸刪除空值元素
function arrayRemoveEmpty(&$array, $trim = true) {
foreach ($array as $key => $value) {
if (is_array($value)) {
arrayRemoveEmpty($array[$key], $trim);
if (empty($array[$key])) unset($array[$key]); // 遞歸後若為空數組也刪除
} else {
$value = $trim ? trim($value) : $value;
if ($value === '') unset($array[$key]);
elseif ($trim) $array[$key] = $value;
}
}
}
// 測試
$a = [ [3], 2, '', ['', 23], 0 ];
arrayRemoveEmpty($a);
print_r($a); // Array ( [0] => Array ( [0] => 3 ) [1] => 2 [3] => Array ( [1] => 23 ) [4] => 0 )
5. 提取多維數組指定鍵的所有值 → 一維數組
function arrayExtractKey($array, $key) {
$result = [];
array_walk_recursive($array, function($v, $k) use ($key, &$result) {
if ($k === $key) $result[] = $v;
});
return $result;
}
// 現代寫法(PHP 5.5+)
function arrayExtractKeyModern($array, $key) {
return array_column(
new RecursiveIteratorIterator(new RecursiveArrayIterator($array)),
$key
);
}
// 測試
$test = [
'111' => 100,
'out' => 200,
'333' => ['out' => 310, [321, 322, 'out' => 'test']]
];
print_r(arrayExtractKey($test, 'out'));
// Array ( [0] => 200 [1] => 310 [2] => test )
6. 實用輔助函數:鍵名/鍵值互換、深度合併、差集