我有一個名為$props的二維陣列,結構如下,
$props = [
['name' => 'Mathmatics', 'time' => '03:01:PM - 04:50:PM'],
['name' => 'History', 'time' => '11:30:AM - 01:30:PM'],
['name' => 'French', 'time' => '01:31:PM - 03:00:PM'],
];
我需要按“時間”鍵對陣列進行排序,以獲得以下結果:
[
['name' => 'History', 'time' => '11:30:AM - 01:30:PM'],
['name' => 'French', 'time' => '01:31:PM - 03:00:PM'],
['name' => 'Mathmatics', 'time' => '03:01:PM - 04:50:PM'],
];
我用usort找到了解決方法,解決方法如下:
usort($props, function ($a, $b) {
return $a["time"] - $b["time"];
});
但是,這不起作用可能是因為我的時間格式特殊(但我必須遵循這種特定的時間格式。)并顯示錯誤并且對陣列不執行任何操作。錯誤:
注意:在 C:\xampp..... 中遇到格式不正確的數值
uj5u.com熱心網友回復:
給定日期(03:01:PM - 04:50:PM等)的格式,需要對其進行排序,同時保持原始值。
從您的問題可以看出,只有第一部分 ( 03:01:PM) 用于排序。即使不是這種情況,也讓我們保留它作為示例(它可以很容易地擴展)。
給定 C 語言環境,轉換時間可以得到一個可以排序的字串(二進制字串順序):
03:01:PM
/ | \
(\d\d):(\d\d):(AM|PM)
\1 \2 \3
-->
\3\1\2
PM0301
給定一個$time作為輸入,可以使用正則運算式搜索和替換來完成轉換:
preg_replace(
'~^(\d ):(\d ):(AM|PM) - .*$~',
'\3\1\2',
$time
);
# ~> "PM0301"
現在要真正對$props陣列進行排序,對所有轉換后的陣列進行排序$times和$props:
$times = preg_replace(
'~^(\d\d):(\d\d):(AM|PM) - .*$~',
'\3\1\2',
array_column($props, 'time')
);
array_multisort($times, $props);
現在$props根據以下內容排序$times:
[
[
'name' => 'History',
'time' => '11:30:AM - 01:30:PM',
],
[
'name' => 'French',
'time' => '01:31:PM - 03:00:PM',
],
[
'name' => 'Mathematics',
'time' => '03:01:PM - 04:50:PM',
],
];
3v4l.org 上的示例。
uj5u.com熱心網友回復:
該解決方案使用usort了特殊的排序功能。日期物件是使用substrand創建的DateTime::createFromFormat。宇宙飛船運算子用于比較。
$arr = [
['name' => 'Mathmatics', 'time' => '03:01:PM - 04:50:PM'],
['name' => 'History', 'time' => '11:30:AM - 01:30:PM'],
['name' => 'French', 'time' => '01:31:PM - 03:00:PM'],
];
usort($arr,function($a,$b){
$dta = DateTime::createFromFormat('h:i:A',substr($a['time'],0,8));
$dtb = DateTime::createFromFormat('h:i:A',substr($b['time'],0,8));
return $dta <=> $dtb;
});
print_r($arr);
嘗試自我:https ://3v4l.org/Fq9U5
uj5u.com熱心網友回復:
對于沒有正則運算式和最少迭代函式呼叫的方法,使用array_map()迭代呼叫createFromFormat(),并使用生成的排序陣列作為對array_multisort()輸入陣列排序的第一個引數。
請注意, 在該createFromFormat()方法中,要求忽略所有剩余字符。
代碼:(演示)
array_multisort(
array_map(
fn($row) => DateTime::createFromFormat('h:i:A ', $row['time']),
$props
),
$props
);
var_export($props);
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/537871.html
標籤:PHP数组排序时间排序
上一篇:計算陣列的隨機字串的字母
下一篇:將鍵值對附加到現有陣列鍵
