2009-07-21 74 views
1

我有这个代码打印出我的数据库中的列,并为我添加一列“Profit”。 距离是以一种复杂的方式计算的,所以在一个循环中完成,而距离到“利润”的转换是在打印出来时完成的。在php数组中排序

我想要做的是按照“利润”的降序排列。我相信(但不知道)最好的方法是将它们存储在一个数组中并“在那里排序”,然后从那里打印出来。

如何确定将数组粘贴到哪一行?
如何在数组中排序?
如何循环访问数组,以便不能将它们打印出来?

//display results 
// now we retrieve the routes from the db 
$query = "SELECT * FROM routes ORDER BY `id`;"; 

// run the query. if it fails, display error 
$result = @mysql_query("$query") or die('<p class="error">There was an unexpected error grabbing routes from the database.</p>'); 

?> 
<tr> 
    <td style="background: url(http://www.teamdelta.byethost12.com/barbg.jpg) repeat-x top;"> 
     <center><b><font color="#F3EC84">»Matches«</font></b></center> 
    </td> 
</tr> 

<tr> 
<td style="background: #222222;"> 

</font> 
<table border="0" width="100%"><tr> 


<td width="10%"><b><center><b>Player</b></center></b></td> 
<td width="10%"><center><b>Base</b></center></td> 
<td width="10%"><b>Location</b></td> 
<td width="5%"><b>Econ</b></td> 
<td width="10%"><b>Distance</b></td> 
<td width="10%"><center><b>Profit cred./h</b></center></td> 
<td width="40%"><b>Comment</b></td> 
<td width="5%"><align="right"><b>Delete</b></align></td> 

</tr> 

<? 

// while we still have rows from the db, display them 
while ($row = mysql_fetch_array($result)) { 

    $dname = stripslashes($row['name']); 
    $dbase = stripslashes($row['base']); 
    $dlocation = stripslashes($row['location']); 
    $dx = stripslashes($row['x']); 
    $dy = stripslashes($row['y']); 
    $dgalaxy = stripslashes($row['galaxy']); 
    $dplanet = stripslashes($row['planet']); 
    $dcomment = stripslashes($row['comment']); 
    $did = stripslashes($row['id']); 
    $decon = stripslashes($row['econ']); 

    $distance = -1 ;//default 

    //distance calc 
    if($dgalaxy == $galaxy) 
    {//interstellar 
     if(($dx == $x) && ($dy == $y)) 
     {//inter planitary 
      if ((floor($planet/10)*10) == (floor($dplanet/10)*10)) 
      {// intra planitary loonar 
      $distance = abs(fmod($planet,10)-fmod($planet,10))*0.1; 
      } 
      else 
      {// inter planitary 
      $distance = abs((floor($planet/10)*10)-(floor($planet/10)*10))*0.2; 
      } 
     }else 
     {//interstllar 
      $distance = round(Sqrt(pow(($dx-$x),2)+pow(($dy-$y),2)));//interstllar 
     } 
    } 
    else 
    {//intergalatic 
     if ((floor($galaxy/10)*10) == (floor($dgalaxy/10)*10)) 
     {//intra galactic cluster 
      $distance = abs(($galaxy-$dgalaxy))*200; 
     }  
     else 
     {//inter galactic cluster 
      if ($galaxy < $dgalaxy) 
      {//anti clockwise inter galactic cluster 
      $distance = (((9-fmod($galaxy,10))*200)+2000+(fmod($dgalaxy,10)*200)); 
      } 
      else 
      {//clockwise inter galactic cluster 
      $distance = (((fmod($galaxy,10))*200)+2000+(fmod(9-$dgalaxy,10)*200)); 
      } 
     } 
    } 

    echo('<tr> 
    <td width=\'20px\'><center>('.$dname.')</center></td> 
    <td><center>'.$dbase.'</center></td> 
    <td><a href="http://delta.astroempires.com/map.aspx?loc='.$dlocation.'">'.$dlocation.'</a></td> 
    <td>'.$decon.'</td><td>'.$distance.' </td> 
    <td>'.round(Sqrt(min($decon,$econ))*(1+Sqrt($distance)/75+Sqrt($players)/10)).'</td> 
    <td>['.$dcomment.']</td> 
    <td><a href=deleterouteconfirm.php?id='.$did.'>Delete</a></td> 
    </tr>'); 
} 
?></table><!--display results table--> 

回答

1

我认为最容易实现的解决方案将是一个双击数据库结果。

第一遍将为每行生成“距离”和“利润”值,并将这些行存储到我们要排序的数组中。

第二遍只是简单地循环遍历第一遍创建的数组,然后显示它们,然后对其进行正确排序并转义输出。

<?php 
//display results 
// now we retrieve the routes from the db 
$query = "SELECT * FROM routes ORDER BY `id`;"; 

// run the query. if it fails, display error 
$result = @mysql_query("$query") or die('<p class="error">There was an unexpected error grabbing routes from the database.</p>'); 

?> 
<tr> 
    <td 
     style="background: url(http://www.teamdelta.byethost12.com/barbg.jpg) repeat-x top;"> 
    <center><b><font color="#F3EC84">»Matches«</font></b></center> 
    </td> 
</tr> 

<tr> 
    <td style="background: #222222;"></font> 
    <table border="0" width="100%"> 
     <tr> 


      <td width="10%"><b> 
      <center><b>Player</b></center> 
      </b></td> 
      <td width="10%"> 
      <center><b>Base</b></center> 
      </td> 
      <td width="10%"><b>Location</b></td> 
      <td width="5%"><b>Econ</b></td> 
      <td width="10%"><b>Distance</b></td> 
      <td width="10%"> 
      <center><b>Profit cred./h</b></center> 
      </td> 
      <td width="40%"><b>Comment</b></td> 
      <td width="5%"><align="right"><b>Delete</b></align></td> 

     </tr> 

<? 

// while we still have rows from the db, display them 
$resultSet = array(); 
while ($row = mysql_fetch_array($result)) 
{ 

    $dname = stripslashes($row['name']); 
    $dbase = stripslashes($row['base']); 
    $dlocation = stripslashes($row['location']); 
    $dx = stripslashes($row['x']); 
    $dy = stripslashes($row['y']); 
    $dgalaxy = stripslashes($row['galaxy']); 
    $dplanet = stripslashes($row['planet']); 
    $dcomment = stripslashes($row['comment']); 
    $did = stripslashes($row['id']); 
    $decon = stripslashes($row['econ']); 

    $distance = -1; //default 


    //distance calc 
    if ($dgalaxy == $galaxy) 
    { //interstellar 
    if (($dx == $x) && ($dy == $y)) 
    { //inter planitary 
     if ((floor($planet/10) * 10) == (floor($dplanet/10) * 10)) 
     { // intra planitary loonar 
     $distance = abs(fmod($planet, 10) - fmod($planet, 10)) * 0.1; 
     } else 
     { // inter planitary 
     $distance = abs((floor($planet/10) * 10) - (floor($planet/10) * 10)) * 0.2; 
     } 
    } else 
    { //interstllar 
     $distance = round(Sqrt(pow(($dx - $x), 2) + pow(($dy - $y), 2))); //interstllar 
    } 
    } else 
    { //intergalatic 
    if ((floor($galaxy/10) * 10) == (floor($dgalaxy/10) * 10)) 
    { //intra galactic cluster 
     $distance = abs(($galaxy - $dgalaxy)) * 200; 
    } else 
    { //inter galactic cluster 
     if ($galaxy < $dgalaxy) 
     { //anti clockwise inter galactic cluster 
     $distance = (((9 - fmod($galaxy, 10)) * 200) + 2000 + (fmod($dgalaxy, 10) * 200)); 
     } else 
     { //clockwise inter galactic cluster 
     $distance = (((fmod($galaxy, 10)) * 200) + 2000 + (fmod(9 - $dgalaxy, 10) * 200)); 
     } 
    } 
    } 
    $row['distance'] = $distance; 
    $row['profit'] = round(Sqrt(min($decon, $econ)) * (1 + Sqrt($distance)/75 + Sqrt($players)/10)); 
    $resultSet[] = $row; 
} 

// Perform custom sort 
usort($resultSet, 'sorter'); 
function sorter($a, $b) 
{ 
    if ($a['profit'] == $b['profit']) return 0; 
    return ($a['profit'] < $b['profit']) ? -1 : 1; 
} 

// Switch to "descending" 
array_reverse($resultSet); 

// Output escape the values 
$safeForHtml = array_map('htmlspecialchars', $resultSet); 

foreach($safeForHtml as $row) 
{ 
    echo ('<tr> 
       <td width=\'20px\'><center>(' . $row['name'] . ')</center></td> 
       <td><center>' . $row['base'] . '</center></td> 
       <td><a href="http://delta.astroempires.com/map.aspx?loc=' . $row['location'] . '">' . $row['location'] . '</a></td> 
       <td>' . $row['econ'] . '</td> 
       <td>' . $row['distance'] . ' </td> 
       <td>' . $row['profit'] . '</td> 
       <td>[' . $row['comment'] . ']</td> 
       <td><a href=deleterouteconfirm.php?id=' . $row['id'] . '>Delete</a></td> 
       </tr>'); 
} 
?> 
</table> 
    <!--display results table--> 
1

你从MySQL得到您的数据。为什么不直接从查询中排序结果?

$query = "SELECT * FROM routes ORDER BY `profit` DESC, `id`;"; 

编辑:重读你的问题,利润是不是一个领域,但你可能要填充表与你的利润值,而不是每次都重新计算它。

编辑2:或者,系住你的输出,计算你的利润,把一切都放在一个数组,然后使用以下命令:

$resultArray; //Your array with all your rows plus a profit key-value pair. 

$sortedArray = array_msort($resultArray, array('profit'=>SORT_DESC)); 

// array_msort by cagret at gmail dot com 
function array_msort($array, $cols) 
{ 
    $colarr = array(); 
    foreach ($cols as $col => $order) { 
     $colarr[$col] = array(); 
     foreach ($array as $k => $row) { $colarr[$col]['_'.$k] = strtolower($row[$col]); } 
    } 
    $params = array(); 
    foreach ($cols as $col => $order) { 
     $params[] =& $colarr[$col]; 
     $params = array_merge($params, (array)$order); 
    } 
    call_user_func_array('array_multisort', $params); 
    $ret = array(); 
    $keys = array(); 
    $first = true; 
    foreach ($colarr as $col => $arr) { 
     foreach ($arr as $k => $v) { 
      if ($first) { $keys[$k] = substr($k,1); } 
      $k = $keys[$k]; 
      if (!isset($ret[$k])) $ret[$k] = $array[$k]; 
      $ret[$k][$col] = $array[$k][$col]; 
     } 
     $first = false; 
    } 
    return $ret; 

} 
+0

我不认为他知道的利润,直到它在代码的计算:`轮(SQRT(分钟($去污,$经济))*(1 + SQRT($距离)/ 75 + SQRT( $ players)/ 10)` – 2009-07-21 16:23:13

+0

编辑我的帖子...他应该用他的利润创建一个表... – 2009-07-21 16:23:47