日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > php >内容正文

php

php 二维sort,php 二维数组排序

發布時間:2023/12/4 php 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 php 二维sort,php 二维数组排序 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前提

給定一個二維數組,請根據指定的數組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,查看了手冊,沒看到說明,?,那就放棄自帶的函數,想自己寫好了:

function arrayOrderBy(array &$arr, $order = null) {

if (is_null($order)) {

return $arr;

}

$orders = explode(',', $order);

usort($arr, function($a, $b) use($orders) {

$result = array();

foreach ($orders as $value) {

list($field, $sort) = array_map('trim', explode(' ', trim($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]);

}

}

arrayOrderBy($arr, 'age asc,sex asc,name desc');

其實這就是一道面試題,大概意思讓用PHP寫一個類似mysql的order by的功能,其實也很簡單。

參考

總結

以上是生活随笔為你收集整理的php 二维sort,php 二维数组排序的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。