首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 二維數組操作大全:去重、排序、降維、刪除空值、鍵值提取實戰函數庫

     編輯:PHP 相關知識

常用鍵值快速獲取

$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. 實用輔助函數:鍵名/鍵值互換、深度合併、差集

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved