2014-03-27 101 views
1
$data = array(
    array('zz', 'name' => 'Jack', 'number' => 22, 'birthday' => '12/03/1980'), 
    array('xx', 'name' => 'Adam', 'number' => 16, 'birthday' => '12/03/1980'), 
    array('aa', 'name' => 'Paul', 'number' => 13, 'birthday' => '12/03/1980'), 
    array('cc', 'name' => 'Helen', 'number' => 44, 'birthday' => '24/06/1967'), 
); 

我想排序上面的數組。sort asc depence on two fields - 多維排序

首先,我想通過birthday。從數組birthday我想通過number。我很喜歡除外這個陣列的輸出數組排序,

$data = array(
     array('cc', 'name' => 'Helen', 'number' => 44, 'birthday' => '24/06/1967'), 
     array('aa', 'name' => 'Paul', 'number' => 13, 'birthday' => '12/03/1980'), 
     array('xx', 'name' => 'Adam', 'number' => 16, 'birthday' => '12/03/1980'), 
     array('zz', 'name' => 'Jack', 'number' => 22, 'birthday' => '12/03/1980'),   
    ); 

從我得到的各個環節進行排序這種解決方案,因爲我除外,其不工作,它是由數排序的值僅

usort($array, function($a, $b) { 
     $rdiff = $a->birthday - $b->birthday; 
     if ($rdiff) return $rdiff; 
     return $a->number - $b->number; 
    }); 

回答

0

問題是生日是一個字符串。您需要先使用strtotime將其轉換爲整數。

$rdiff = strtotime($a->birthday) - strtotime($b->birthday); 

由於這些日期是在英國的格式,你需要d/M/Y之間的斜線改爲連字符,如使用斜線時的strtotime預計日期是美國格式,即M/d /年。從PHP手冊:

日期在米/ d/YDMY格式通過查看在各個組件之間的分離器消除歧義:如果分離器是斜線(/),則假設美國m/d/y;而如果分隔符是破折號( - )或點(。),則假定格式爲歐洲版。

所以使用:

$rdiff = strtotime(str_replace('/', '-', $a->birthday)) - strtotime(str_replace('/', '-', $b->birthday)); 
+0

是的,忘記these.working罰款。 – user2439275