PHP按数组键的值排序

PHP按数组键的值排序,php,Php,我正在创建一个数组,其中包含一个日期: $arr = array(); $arr["one"][] = array( 'due' => '17-01-2021 10:00:00', ); $arr["one"][] = array( 'due' => '17-01-2021 09:00:00', ); $arr["two"][] = array( 'due' => '19-01-2021 09:

我正在创建一个数组,其中包含一个日期:

$arr = array();
$arr["one"][] = array(
    'due' => '17-01-2021 10:00:00',
);
$arr["one"][] = array(
    'due' => '17-01-2021 09:00:00',
);
$arr["two"][] = array(
    'due' => '19-01-2021 09:00:00',
);
$arr["two"][] = array(
    'due' => '18-01-2021 09:00:00',
);
我想按“到期”键的值排序

我尝试添加此uasort函数:

uasort($arr, function ($a, $b) {
    return $a["due"] <=> $b["due"];
});

print_r($arr);
uasort($arr,function($a,$b){
返回$a[“到期”]$b[“到期”];
});
印刷费($arr);

但这仍然显示在上面的顺序中,而它应该首先显示'09:00:00'值

  • 分别在每个“字号索引”数组上循环(在主数组中的
    one
    two
    下索引的那些数组
    $arr
  • 将到期日期/时间转换为unix时间戳,以具有可比较的整数。如果没有这一点,PHP将尝试按字符对字符串进行排序,这与您的格式不兼容,但如果您的格式是
    YYYY-MM-DD hh:MM:ss
    (因为“最大”位置值将在开始处),则会起作用
  • 使用
    usort
    而不是
    uasort
    ,因为在这种情况下,没有必要保留键(以整数开头,既不是
    one
    也不是
    due
  • $arr=array();
    $arr[“一”][]=阵列(
    “到期日”=>“17-01-2021 10:00:00”,
    );
    $arr[“一”][]=阵列(
    “到期日”=>“17-01-2021 09:00:00”,
    );
    $arr[“两个”][]=阵列(
    “到期日”=>“19-01-2021 09:00:00”,
    );
    $arr[“两个”][]=阵列(
    “到期日”=>“18-01-2021 09:00:00”,
    );
    foreach($arr as和$numberIndex){
    usort($numberIndex,函数($a,$b){
    返回strotime($a[“到期”])strotime($b[“到期”]);
    });
    }
    印刷费($arr);
    
    一些旁注:

    • 请注意
      &
      处的
      &$numberIndex
      ,如果没有此项,PHP将在您的值的就地副本上工作,并且在
      $arr
      中它永远不会更改
    • 只有当所有日期/时间都在历元时间0(1970年1月1日)之后时,使用
      strotoime()
      的这种方法才有效。如果需要使用较旧的日期,可以在排序回调中创建
      DateTime()
      对象
    生成的数组如下所示:

    Array
    (
        [one] => Array
            (
                [0] => Array
                    (
                        [due] => 17-01-2021 09:00:00
                    )
    
                [1] => Array
                    (
                        [due] => 17-01-2021 10:00:00
                    )
    
            )
    
        [two] => Array
            (
                [0] => Array
                    (
                        [due] => 18-01-2021 09:00:00
                    )
    
                [1] => Array
                    (
                        [due] => 19-01-2021 09:00:00
                    )
    
            )
    
    )
    

    我不知道使用
    uasort
    函数有什么方法可以做到这一点,当然创建循环会更容易,或者这是一个性能问题吗?有几个问题-您的数据在
    $arr[“one”]
    中,所以使用这个数组进行排序,测试的两边都是
    $b[“due”]
    @NigelRen我确实有比“一”更多的键,所以我使用了
    $ret
    如果您的数据比这更复杂,那么您需要展示一个简短的示例来澄清这一点,但希望这个想法能有所帮助。需要非常小心的一件事是,您正在比较字符串和(听起来好像)您希望它按日期/时间顺序排列。太棒了,非常感谢!