2013-11-27 88 views
0

我有一個對象數組,我想排序。我想在兩個值數組進行排序爲每個對象:Php根據兩個值對數組中的對象進行排序

例如

Array (
[0] => "TeamName time (Id) - CoachName", 
[1] => "TeamName time (Id) - CoachName" 
... 
) 

我想在CoachName第一排序,然後在time使得

之前排序

Array(
[0] => "FirstTeam 12:00-12:30 (1234) - Jack Harper", 
[1] => "FirstTeam 12:00-12:30 (5678) - Sofia Jackson", 
[2] => "SecondTeam 12:30-13:00 (1122) - Jack Harper", 
[3] => "SecondTeam 12:30-13:00 (2211) - Sofia Jackson" 
) 

後排序

Array(
[0] => "FirstTeam 12:00-12:30 (1234) - Jack Harper", 
[1] => "SecondTeam 12:30-13:00 (1122) - Jack Harper", 
[2] => "FirstTeam 12:00-12:30 (5678) - Sofia Jackson", 
[3] => "SecondTeam 12:30-13:00 (2211) - Sofia Jackson" 
) 
+0

你可以更改數組嗎?所以你在教練名和時間(也)作爲一個單獨的數組值。 – putvande

+0

加油......這並不難,自己試試...... :-)我只是在排序功能裏面進行一些字符串評估... – MarcoS

+0

你是怎麼試圖解決這個問題的?你有沒有訪問你的數據,而不是連接字符串形式? – afuzzyllama

回答

2

可以使用手工製作的比較函數提供給PHP的usort函數。

$a = array(
      "FirstTeam 12:00-12:30 (1234) - Jack Harper", 
      "FirstTeam 12:00-12:30 (5678) - Sofia Jackson", 
      "SecondTeam 12:30-13:00 (1122) - Jack Harper", 
      "SecondTeam 12:30-13:00 (2211) - Sofia Jackson" 
      ); 

function cmpCoachTime($s1, $s2) { 
    $pattern = '/(\d{2}:\d{2}).*? - ([\w\s]+)/'; 
    preg_match($pattern, $s1, $matches); 
    $coach1 = $matches[2]; 
    $time1 = strtotime($matches[1]); 
    preg_match($pattern, $s2, $matches); 
    $coach2 = $matches[2]; 
    $time2 = strtotime($matches[1]); 
    $coachCmp = strcmp($coach1, $coach2); 
    if ($coachCmp == 0) { 
    if ($time1 == $time2) { 
     return 0; 
    } 
    return $time1 < $time2 ? -1 : 1; 
    } 
    return $coachCmp; 
} 

var_dump($a); // outputs initial array 

usort($a, 'cmpCoachTime'); 

var_dump($a); // ouputs sorted array 

測試您的輸入並獲得所需輸出。

1

你可以找到在PHP文檔爲例,用在array_multisort:

鏈接:http://www.php.net/manual/en/function.array-multisort.php

使用示例:

<?php 
$data[] = array('volume' => 67, 'edition' => 2); 
$data[] = array('volume' => 86, 'edition' => 1); 
$data[] = array('volume' => 85, 'edition' => 6); 
$data[] = array('volume' => 98, 'edition' => 2); 
$data[] = array('volume' => 86, 'edition' => 6); 
$data[] = array('volume' => 67, 'edition' => 7); 



// Obtain a list of columns 
foreach ($data as $key => $row) { 
    $volume[$key] = $row['volume']; 
    $edition[$key] = $row['edition']; 
} 

// Sort the data with volume descending, edition ascending 
// Add $data as the last parameter, to sort by the common key 
array_multisort($volume, SORT_DESC, $edition, SORT_ASC, $data); 

?> 

和排序結果:

volume | edition 
-------+-------- 
    98 |  2 
    86 |  1 
    86 |  6 
    85 |  6 
    67 |  2 
    67 |  7 

林不知道有其他/更好的選擇,但這是我發現第一:)。

祝你好運, Stefan。

+0

這不會在OP的陣列上工作我認爲,因爲它是全部1值。 – putvande

+0

他的數據如何保存並不是很清楚,如果它是全部1值,則排序將不可能。無論如何,它應該保存在對象中(OOP):)。 –

+1

@putvande - 也許OP可以弄清楚如何將字符串拆分爲更友好的數據結構,然後利用這個答案。 – afuzzyllama

0

我覺得這裏的權利結構是關聯數組的數組...

[ 
    [ 
     'teamName' => 'FirstTeam', 
     'startTime' => '12:00', 
     'endTime' => '12:30', 
     'id' => '1234', 
     'coachName' => 'Jack Harper', 
    ], 
    ... 
]; 

這將是很容易對它進行排序... :-)

相關問題