摘要:前提給定一個二維數(shù)組,請根據(jù)指定的數(shù)組寫出最優(yōu)的排序。排序條件,指定數(shù)組如下估計大家都沒有什么問題,排序嘛,簡單的不要不要的方式一這應(yīng)該是最簡單的方式了,直接使用現(xiàn)成的函數(shù),快捷的不要不要的。
前提
給定一個二維數(shù)組,請根據(jù)指定的數(shù)組key,寫出最優(yōu)的排序。排序條件age asc,sex desc,指定數(shù)組如下:
$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);
這應(yīng)該是最簡單的方式了,直接使用php現(xiàn)成的函數(shù),快捷的不要不要的。
方式二:$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);
嗯,勉強看的過去,但是感覺有點不優(yōu)雅。
方式三:$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); });
三種方式都可以,都比較簡單,那么問題來了。
問題如果排序數(shù)組不是固定的呢,排序數(shù)組是動態(tài)從數(shù)據(jù)庫查詢出來,排序條件也不是固定的呢,那么我們肯定要封裝函數(shù),如果使用php內(nèi)置函數(shù):
function _sort(){ ...... array_multisort(...) }
這里我們就看出問題來了,array_multisort的參數(shù)不固定啊,使用有兩個方法:func_get_args()和...$arg,放棄func_get_args(),因為沒有辦法使用。如果是自己寫的函數(shù)也建議不用,因為使用func_get_args(),容易讓函數(shù)看上去是不需要傳遞參數(shù)的。如果你在寫大量代碼的時候,進行縮放的時候,也很難了解這個函數(shù)參數(shù)大概細節(jié)。這是非常不方便的。所以函數(shù)如下:
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,查看了手冊,沒看到說明,
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/28964.html
摘要:數(shù)組的排序,如果是一維的,那肯定相信大家都沒問題。但是如果數(shù)組是二維的呢其實問題也不大畢竟大法好但是我想給大家介紹的是自己內(nèi)置的一個函數(shù)就是他下面,請看一個例子某一個需要排序的神秘排序具體實現(xiàn)排序過程,還請小伙伴們自行腦補 數(shù)組的排序,如果是一維的,那肯定相信大家都沒問題。但是如果數(shù)組是二維的呢?其實問題也不大 showImg(https://segmentfault.com/img/...
摘要:之前看到一道面試題,大概意思是盡可能的寫出來給二維數(shù)組按照某個字段值排序的功能比如說是下面數(shù)組結(jié)構(gòu)按照年齡對用戶進行排序大家第一眼感覺應(yīng)該是用循環(huán),然后用冒泡排序之類的去計算但這一道題顯然不是去考察大眾都能想到的它應(yīng)該是想考一下求職者對基本 之前看到一道面試題,大概意思是盡可能的寫出來給二維數(shù)組按照某個字段值排序的功能;比如說是下面數(shù)組結(jié)構(gòu): $users = [ [name ...
摘要:需求現(xiàn)在有下面一組二維數(shù)組青葉我是青葉合肥男足球棒球需要將處于第二維鍵名為,其值相同的數(shù)組的合并形成一個新的數(shù)組。 需求 現(xiàn)在有下面一組二維數(shù)組: array(8) { [0]=> array(2) { [name]=> string(4) name [value]=> string(6) 青葉 } [1]=> array(2) { ...
閱讀 3187·2021-11-23 10:02
閱讀 3146·2021-11-16 11:53
閱讀 3123·2021-09-23 11:21
閱讀 3399·2019-08-30 13:02
閱讀 1659·2019-08-29 16:18
閱讀 1593·2019-08-29 12:55
閱讀 1489·2019-08-26 12:24
閱讀 2119·2019-08-26 10:36