PHP array multisort

独自空忆成欢 提交于 2019-12-11 04:04:44

问题


I am attempting to sort an array based off the key, "dispatched". However, it is not working. Does anyone have any pointers to get this code working? Thanks:

Array:

Array
(
    [0] => Array
        (
            [wcccanumber] => 130700203
            [call] => SEIZURES
            [address] => 221 S PINE ST
            [county] => C
            [station] => CNB
            [department] => CANBY FIRE DISTRICT #62
            [units] => E61, M62
            [dispatched] => 20:43:59
        )

    [1] => Array
        (
            [wcccanumber] => 130700198
            [call] => CARD/RESP ARREST
            [address] => 40781 HWY 26
            [county] => C
            [station] => SAN
            [department] => SANDY FIRE DISTRICT #72
            [units] => 3709, CH37, M1, M272, R71
            [dispatched] => 19:33:27
        )

    [2] => Array
        (
            [wcccanumber] => 130700337
            [call] => TRAUMA C1
            [address] => 16500 SW CENTURY DR
            [county] => W
            [station] => SHW
            [department] => TUALATIN VALLEY FIRE & RESCUE
            [units] => E33, METWA, MW68
            [dispatched] => 21:40:13
        )

    [3] => Array
        (
            [wcccanumber] => 130700335
            [call] => FALL C1
            [address] => 48437 NW PONGRATZ RD
            [county] => W
            [station] => BUX
            [department] => BANKS FIRE DISTRICT #13
            [units] => E14, METWA, MW57, R13
            [dispatched] => 21:07:48
        )

)

Code:

public function sortActiveCalls () 
{
    foreach ($this->getActiveCalls() as $key => $val) {
           $time[$key] = $val['dispatched'];
    }

    array_multisort($time, SORT_ASC, $this->getActiveCalls());
}

回答1:


I find it easier just to use usort

 usort($array, function ($a, $b) {
       return strtotime($a["dispatched"]) - strtotime($b["dispatched"]);
 });

For your case you would reimplement your sortActiveCalls method as

public function sortActiveCalls(){
     $data = $this->getActiveCalls();
     usort($data, function ($a, $b) {
       return strtotime($a["dispatched"]) - strtotime($b["dispatched"]);
     });
     return $data;
}

Not this will only work in php 5.3 and up

If you are using an older version of php you will have to define a separate function to do the sort like

if (!function_exists("sortByDispatched")){
  function sortByDispatched($a, $b){
    return strtotime($a["dispatched"]) - strtotime($b["dispatched"]);
  }
}
usort($array, "sortByDispatched");



回答2:


In additional to what Orangepill said, if you are using 5.2 or older, you can use the create_function() to create an anonymous (lambda-style) function instead. For example,

usort($array, create_function( '$a,$b', 
'return strtotime($a["dispatched"]) - strtotime($b["dispatched"]);'));


来源:https://stackoverflow.com/questions/17439905/php-array-multisort

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!