2013-04-29 66 views
1

在xampp開發環境中使用PHP 5.4.7。陣列以奇怪的順序輸出元素

我有一個函數在我的數據層文件中,從MySql表中獲取數據,然後創建一個2維數組,以便日後可以訪問這些內容。當我使用print_r打印出這個數據層文件本身的元素時,它們以索引的正確順序打印,即0,1,2,3,4,5。但是當我在別處調用此函數並打印元素時,它們以5,0,1,2,3,4的順序出來。

切換肯定發生在創建函數和使用它的時間之間。我搜遍了所有,但沒有發現任何這樣的論壇上提到的。

這是函數:

function getAllActivitiesAtEvent($eventId) 
{ 
    $query = ("SELECT * FROM activity WHERE '$eventId' = activity.event_id"); 
    $result = @mysql_query ($query) or die (mysql_error()); 
    $num = mysql_num_rows ($result); 
    if ($num != 0) 
    { 
     $allActs[$num-1] = array(); 
     $i = 0; 
     while ($row = mysql_fetch_array ($result)) 
     { 
      $oneAct = [ 
      "index" => $i, 
      "actId" => $row ['activity_id'], 
      "actName" => $row ['activity_name'], 
      "actSC" => $row ['activity_short_code'], 
      "actPL" => $row ['project_leader'], 
      "actCap" => $row ['capacity'], 
      "actDOW" => $row ['day_of_week'], 
      "actDate" => $row ['date'] 
      ]; 
      $allActs[$i] = $oneAct; 
      $i++; 
     }$i = 1; 
    } 
    return $allActs; 
} 

...當我此頁面上的print_r,順序是正確的。

當我調用此函數另一個頁面上,像這樣:

dbconnect(); 
$activityArr = getAllActivitiesAtEvent($eventId); 

,然後打印出的元素,順序是錯的!

+2

是的,顯示你的代碼,很難猜測。 – 2013-04-29 20:09:21

+0

什麼問題? PHP會按照它們分配的順序輸出元素。如果索引5在2之前分配,則5將在print_r中的2之前顯示。 如果你想讓它們按照數字順序排列,可以考慮使用[ksort](http://us1.php.net/ksort)。 – 2013-04-29 20:12:47

+0

對不起,但我似乎無法弄清楚如何縮進我的代碼,使其看起來像代碼! – swissphp 2013-04-29 20:27:56

回答

0

嘗試用:

function getAllActivitiesAtEvent($eventId) 
{ 
    $query = ("SELECT * FROM activity WHERE '$eventId' = activity.event_id"); 
    $result = @mysql_query ($query) or die (mysql_error()); 
    $num = mysql_num_rows ($result); 
    $allActs = array(); 
    if ($num != 0) 
    { 
     $i = 0; 
     while ($row = mysql_fetch_array ($result)) 
     { 
      $allActs[] = ["index" => $i++, 
      "actId" => $row ['activity_id'], 
      "actName" => $row ['activity_name'], 
      "actSC" => $row ['activity_short_code'], 
      "actPL" => $row ['project_leader'], 
      "actCap" => $row ['capacity'], 
      "actDOW" => $row ['day_of_week'], 
      "actDate" => $row ['date']]; 
     } 
    } 
    return $allActs; 
} 

線$ allActs [] = $ oneAct將追加,以便他們,$是不是真的需要我。

+0

謝謝 - 我試過了,它確實有效,但排序仍然不可靠!我如何附加一個顯示其功能的屏幕截圖?在我的數據庫中,6個元素的ID號分別爲93,94,95,96,97和98,但輸出的總是98,93,94,95,96,97。 – swissphp 2013-04-29 20:48:58

+0

如果將ORDER BY'event_id'添加到查詢,該命令仍然won?? – eried 2013-04-29 21:12:20

+0

@ user2136826:我嘗試了ORDER BY(在activity_id列上),並沒有改變調用頁面的順序。請記住,在功能頁面(它被聲明的地方),一切都按照正確的順序。只有在調用頁面上,輸出纔是真實的。我會稍後嘗試一些你在這裏建議的其他功能...... – swissphp 2013-04-30 07:34:42

0

不知道這是否有幫助,但我清理了一下代碼,並在您的SQL語句中添加了「ORDER BY」。我也使用array()來添加新的$ allAccts元素。如果您只關注activity_id,則可以不使用'index'屬性和$ i計數器。

如果仍然不起作用,您可能需要查看array_push(append elements)或array_unshift(prepend elements)。這就是您可以安全地實施LIFO或FIFO的方式。

function getAllActivitiesAtEvent($eventId) 
{ 
    $query = "SELECT * FROM activity WHERE event_id='".$eventId."' ORDER BY activity_id"; 
    $result = @mysql_query($query) or die (mysql_error()); 
    $allActs = array(); 
    if(mysql_num_rows($result) > 0) 
    { 
     while($row = mysql_fetch_array($result)) 
     { 
      $allActs[] = array( 
      "actId" => $row['activity_id'], 
      "actName" => $row['activity_name'], 
      "actSC" => $row['activity_short_code'], 
      "actPL" => $row['project_leader'], 
      "actCap" => $row['capacity'], 
      "actDOW" => $row['day_of_week'], 
      "actDate" => $row['date']); 
     } 
    } 
    return $allActs; 
} 
+0

嗨,謝謝。我只是將$ i添加到數組中,因爲我想要打印的內容比從數據庫的activity_id中篩選出對用戶更有意義的內容,並且他們看到1,2,3比93,94,95等更有意義。但我可以沒有它。這是一個細節。 – swissphp 2013-04-30 07:36:31

+0

嘿,這太棒了!您的「清理」版本完美無缺!我看到明確指出內部陣列不是必需的,這對我來說是一個驚喜。另外,你能解釋爲什麼你引用我的$查詢嗎?我見過的其他例子使用括號。這可能會打破它,或者它更可能是數組中的數組?無論如何,非常感謝。 – swissphp 2013-04-30 10:35:20

+0

不客氣!爲了美觀的目的,我刪除了圍繞您的查詢的括號;通常它用於組織或邏輯分組。在這個查詢中,我不認爲這是需要的。至於破損的代碼,我相信這是查詢中缺少的'ORDER BY'或者沒有正確排序的內部數組。 – clementcyu 2013-04-30 14:49:49