2011-09-22 172 views
0

嘿,我有一组结果从数据库返回,他们是代表1 - 18这是drivers_id的数字,它可以返回任何数量的那些取决于多少司机从种族退休。然后,我将它们匹配到用户驱动程序,如果它们匹配,则用户点数为-10点。PHP循环系统的帮助

如果它们不匹配,则返回+5点。如果查询根本没有返回任何设置,那么我知道用户四个驱动程序每个都可以是+5点,但是如果它返回5个行,那我该如何循环并匹配它们呢?如果没有匹配,则将+5点添加到该驱动程序变量,但必须在比较所有结果集之后进行比较,因为该驱动程序可能与$ row中的下一行匹配。非常感谢您提供的任何帮助!

P.S在结果集中的每一driver_id是唯一的,所以一旦一个比较 是真的那么driver_id不会再次出现。

$results = mysql_query("SELECT drivers_id FROM results_retired WHERE drivers_id IN ('$driver1', '$driver2', '$driver3', '$driver4') AND track_id = '$track'") or die ("Failed to update" . mysql_error()); 

$retireddrivers = mysql_fetch_array($results) 

if(in_array($driver1, $retireddrivers)){ 
    $driveronepoints -= $driver_points_system["retired"]; 
} 
else { 
    $driveronepoints += $driver_points_system["completion"]; 
} 
if(in_array($driver2, $retireddrivers)) { 
    $drivertwopoints -= $driver_points_system["retired"]; 
} 
else { 
    $drivertwopoints += $driver_points_system["completion"]; 
} 
if(in_array($driver3, $retireddrivers)) { 
    $driverthreepoints -= $driver_points_system["retired"]; 
} 
else { 
    $driverthreepoints += $driver_points_system["completion"]; 
} 
if(in_array($driver4, $retireddrivers)) { 
    $driverfourpoints -= $driver_points_system["retired"]; 
} 
else { 
    $driverfourpoints += $driver_points_system["completion"]; 
} 

我已经做了一些改动,现在的代码,是in_array功能确定在这种情况下使用?

感谢

+0

你可以在数组函数中使用类似上面的变量名来比较数组的内容。 – Lee

+0

你能告诉我们$ driver1,$ driver2等等来自哪里吗? –

+0

有什么问题? –

回答

1

它看起来像你缺少的行VS列的概念。

mysql_fetch_*会返回一行 - 即一个的退休司机ID - 每次调用。您需要将它们收集到一个数组中,然后才能使用in_array

while ($retired_driver = mysql_fetch_array($results)) 
{ 
    $retireddrivers[] = $retired_driver['driver_id']; 
} 

另外,如果你可以管理它,我会考虑把驱动程序1-4放入一个数组中。那么你可以像

// Ideally, $driver[1-4]* won't exist at all -- you'd pull the info from the DB, 
// or from the form, and stuff it directly into the array. 
// This code right here is just to make existing code work 
$drivers = array(
    array('id' => $driver1, 'points' => &$driver1points), 
    array('id' => $driver2, 'points' => &$driver2points), 
    array('id' => $driver3, 'points' => &$driver3points), 
    array('id' => $driver4, 'points' => &$driver4points), 
); 

foreach ($drivers as $driver) 
{ 
    if (in_array($driver['id'], $retireddrivers)) 
    { 
     $driver['points'] -= $driver_points_system['retired']; 
    } 
    else 
    { 
     $driver['points'] += $driver_points_system['completion']; 
    } 
} 

大大减少重复的代码。

+0

非常感谢!我刚刚遇到了如何通过优化代码进行有效循环的问题。这给了我一个有用的见解!再次感谢。那么现在每个$驱动程序和每个驱动程序ID的点是在一个数组内? – Lee

+0

是的,驾驶员的身份证和积分是绑在一起的。 '$ drivers [0] ['id']'是第一个驱动的ID,'$ drivers [0] ['points']'是他们的分数。如果你想要清理东西,那么这些数组将成为一个Driver类的很好的候选者,但是现在阵列工作得很好。 – cHao