我有以下代碼:
$check = array('person a','person c');
$data = array('person c','person a','person d','person e');
define('check',$check);
//asort($data);
print'<pre>';print_r($data);print'</pre>';
usort($data,function($a,$b){
return empty(check[$a]) ? 1 : $a <=> $b;
});
print'<pre>';print_r($data);print'</pre>';
exit;
我想要實作的是:
person d
person e
person a
person c
我得到的是
person e
person a
person d
person c
因為人員 a 和 c 在$check陣列中,所以我試圖根據字母順序對不在 $check 組中的人以及那些在的人進行排序。我可能可以將事情分開一點,并且對usort自定義功能不太熟悉,但是有可能以這種方式實作嗎?
uj5u.com熱心網友回復:
創建一個“映射”陣列,使用array_map()和in_array()標記每個$data專案,然后array_multisort()是映射陣列和$data陣列:
<?php
$check = array('person a','person c');
$data = array('person c','person a','person d','person e');
function dmap ($itm) {
GLOBAL $check;
return ((int)in_array($itm, $check) 1) . $itm;
}
$mm = array_map('dmap', $data);
array_multisort($mm, $data);
print_r($data);
exit;
輸出:
Array
(
[0] => person d
[1] => person e
[2] => person a
[3] => person c
)
當向函式提供兩個陣列時,array_multisort()對第一個陣列進行排序,默認為升序,并將第一個陣列的排序順序應用于第二個陣列。
“映射”陣列只是在陣列的每個元素前面加上一個1或,以影響排序順序,將在第一個排序位置中未找到的專案移動到第一個排序位置。2$data$check
在這里試試:https ://onlinephp.io/c/5ae10
uj5u.com熱心網友回復:
嘗試這個。首先獲取第一個陣列中不在第二個陣列中的所有專案:
$data = array_diff($data, $check);
對兩個陣列進行排序:
usort($data,function($a,$b){
return $a <=> $b;
});
usort($check,function($a,$b){
return $a <=> $b;
});
將它們合并在一起
$merged = array_merge($data, $check);
uj5u.com熱心網友回復:
最現代的方法是使用array_map()箭頭語法并檢查每個資料值是否在檢查陣列中。當布林值升序排序時,假在真之前。
array_multisort()與在這種情況下相比,這是一個更好的選擇,因為會進行usort()更少的呼叫。in_array()
代碼:(演示)
array_multisort(
array_map(fn($v) => in_array($v, $check), $data),
$data
);
var_export($data);
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/524700.html
上一篇:如何將<inputtype="file>編碼為base64字串?
下一篇:洗掉具有重復id和排序值的物件
