摘要:前提給定一個二維數組,請根據指定的數組寫出最優的排序。排序條件,指定數組如下估計大家都沒有什么問題,排序嘛,簡單的不要不要的方式一這應該是最簡單的方式了,直接使用現成的函數,快捷的不要不要的。
前提
給定一個二維數組,請根據指定的數組key,寫出最優的排序。排序條件age asc,sex desc,指定數組如下:
$arr = [ ["id"=>1, "age"=>1, "sex"=>6, "name"=>"a"], ["id"=>2, "age"=>3, "sex"=>1, "name"=>"c"], ["id"=>3, "age"=>3, "sex"=>1, "name"=>"b"], ["id"=>4, "age"=>2, "sex"=>1, "name"=>"d"], ];
估計大家都沒有什么問題,排序嘛,簡單的不要不要的:
方式一:array_multisort(array_column($arr,"age"),SORT_ASC,array_column($arr,"sex"), SORT_DESC, $mylist);
這應該是最簡單的方式了,直接使用php現成的函數,快捷的不要不要的。
方式二:$sort = []; foreach($arr as $k=>$v) { $sort["age"][$k] = $v["age"]; $sort["sex"][$k] = $v["sex"]; } array_multisort($sort["age"],SORT_ASC,$sort["sex"],SORT_DESC,$mylist);
嗯,勉強看的過去,但是感覺有點不優雅。
方式三:$orders=["age"=>"asc","sex"=>"desc"]; usort($arr, function($a, $b) use($orders) { $result = []; foreach ($orders as $key=>$value) { list($field, $sort) = [$key,$value]; if (!(isset($a[$field]) && isset($b[$field]))) { continue; } if (strcasecmp($sort, "desc") === 0) { $tmp = $a; $a = $b; $b = $tmp; } if (is_numeric($a[$field]) && is_numeric($b[$field]) ) { $result[] = $a[$field] - $b[$field]; } else { $result[] = strcmp($a[$field], $b[$field]); } } return implode("", $result); });
三種方式都可以,都比較簡單,那么問題來了。
問題如果排序數組不是固定的呢,排序數組是動態從數據庫查詢出來,排序條件也不是固定的呢,那么我們肯定要封裝函數,如果使用php內置函數:
function _sort(){ ...... array_multisort(...) }
這里我們就看出問題來了,array_multisort的參數不固定啊,使用有兩個方法:func_get_args()和...$arg,放棄func_get_args(),因為沒有辦法使用。如果是自己寫的函數也建議不用,因為使用func_get_args(),容易讓函數看上去是不需要傳遞參數的。如果你在寫大量代碼的時候,進行縮放的時候,也很難了解這個函數參數大概細節。這是非常不方便的。所以函數如下:
function _sort( &$arr, $sorts ) { $sortParams = []; foreach ( $sorts as $key => $v ) { $sortParams[] = array_column($arr, $key); $sortParams[] = strcasecmp($v, "desc") === 0 ? SORT_DESC : SORT_ASC; } array_push($sortParams, $arr); array_multisort(...$sortParams); } _sort(["age"=>"asc","name"=>"desc","sex"=>"asc"]);
看是去很好對吧,但是運行才知道,沒有效果,難道是array_multisort不支持...$arg,查看了手冊,沒看到說明,
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/28964.html
摘要:之前看到一道面試題,大概意思是盡可能的寫出來給二維數組按照某個字段值排序的功能比如說是下面數組結構按照年齡對用戶進行排序大家第一眼感覺應該是用循環,然后用冒泡排序之類的去計算但這一道題顯然不是去考察大眾都能想到的它應該是想考一下求職者對基本 之前看到一道面試題,大概意思是盡可能的寫出來給二維數組按照某個字段值排序的功能;比如說是下面數組結構: $users = [ [name ...
摘要:需求現在有下面一組二維數組青葉我是青葉合肥男足球棒球需要將處于第二維鍵名為,其值相同的數組的合并形成一個新的數組。 需求 現在有下面一組二維數組: array(8) { [0]=> array(2) { [name]=> string(4) name [value]=> string(6) 青葉 } [1]=> array(2) { ...
閱讀 3143·2021-11-23 10:02
閱讀 3118·2021-11-16 11:53
閱讀 3093·2021-09-23 11:21
閱讀 3369·2019-08-30 13:02
閱讀 1622·2019-08-29 16:18
閱讀 1557·2019-08-29 12:55
閱讀 1457·2019-08-26 12:24
閱讀 2085·2019-08-26 10:36