PHP 陣列排序(複雜字串)

charliecen發表於2018-11-26

由於陣列中包含數字特殊字元中文等,所以自然排序就無法使用。這裡用自定義辦法

// 陣列
$arr1 = ['1000-2000元', '1000元以下', '8000元以上', '5001-8000元', '2001-3000元', '3001-5000元'];
$arr2 = ['3小時以上', '1小時以內', '1-3小時'];

// 排序方法
function array_asort(&$array) {
    if (!isset($array) || !is_array($array)) {
        return false;
    }

    $real_arr = [
        '1000元以下'  => '0-999元',
        '1小時以內' => '0-1小時',
    ];

    foreach ($array as $k => $v) {
        if (in_array($v, array_keys($real_arr))) {
            $array[$k] = $real_arr[$v];
        } else {
            $array[$k] = $v;
        }
    }

    asort($array);

    foreach ($array as $k => $v) {
        if (in_array($v, array_values($real_arr))) {
            $newArr = array_flip($real_arr); // 陣列鍵值翻轉
            $array[$k] = $newArr[$v];
        } else {
            $array[$k] = $v;
        }
    }
    return true;
}

// 方法
array_asort($arr1);
array_asort($arr2);

echo '<pre>';
var_dump($arr1);
var_dump($arr2);

// 結果
array(6) {
  [1]=>
  string(13) "1000元以下"
  [0]=>
  string(12) "1000-2000元"
  [4]=>
  string(12) "2001-3000元"
  [5]=>
  string(12) "3001-5000元"
  [3]=>
  string(12) "5001-8000元"
  [2]=>
  string(13) "8000元以上"
}
array(3) {
  [1]=>
  string(13) "1小時以內"
  [2]=>
  string(9) "1-3小時"
  [0]=>
  string(13) "3小時以上"
}

相關文章