2013-11-27 89 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', 
    ], 
    ... 
]; 

这将是很容易对它进行排序... :-)

相关问题