2010-01-15 125 views
2

我需要按照另一個數組內容的精確順序排序關聯數組。 該數組通過2個獨立的sql請求(如下所述)進行檢索。請求不能合併爲只有一個請求,所以我必須按照第一個數組的順序排序第二個數組。由其他數組排序關聯數組

這些都是數組:

#Array which contains the id's in needed order 
$sorting_array = array(1,2,3,8,5,6,7,9,11,10...); 

#Array which contains the values for the id's, but in order of "id" ASC 
$array_to_sort = array(
       array("id" => "1", "name" => "text1", "help" => "helptxt2"); 
       array("id" => "2", "name" => "text2", "help" => "helptxt2"); 
); 

的SQL查詢:
SQL-Ouery爲$ sorting_array:
(分貝場 '的conf' 是設置爲 「文本」,也許這是我的問題使我不得不先爆炸和內爆的條目之前,我可以使用它的下一個查詢)

$result = sql_query("select conf from config where user='me'", $dbi); 
$conf = sql_fetch_array($result, $dbi); 
$temp = explode(',', $conf[0]); 
$new = array($temp[0], $temp[1], $temp[2], $temp[3],$temp[4], 
      $temp[5], $temp[6], $temp[7], $temp[8], $temp[9], 
      $temp[10], ...);#Array has max 30 entries, so I count them down here 
$sorting_array = implode(',', $new); 

SQL-Ouery爲$ array_to_sort:

$result = sql_query("SELECT id, name, helptxt 
        FROM table 
        WHERE id IN ($sorting_array) 
        AND language='english'"); 
while ($array_to_sort[] = mysql_fetch_array ($result, MYSQL_ASSOC)) {} 
array_pop($array_to_sort);#deleting the last null entry 

我可以訪問$ array_to_sort,如下所示一個接一個地看內容:
(如果下面的行與上面的數組不匹配,那麼我混淆了它。但是,線條下面是什麼帶來的內容)

echo $array_to_sort[0]["id"]; 
echo $array_to_sort[0]["name"]; 
echo $array_to_sort[0]["helptxt"]; 

但它是由「ID」 ASC排序,但我需要完全排序爲$ sorting_array。 我嘗試了一些事情:

while(list(,$array_to_sort) = each($sorting_array)){ 
$i++; 
echo $array_to_sort . "<br>"; 
} 

只帶來了標識的正確的順序,而不是內容。現在我有點困惑,因爲我嘗試了很多東西,但最終都給了我相同的結果。
也許sql-query可以在一個步驟中完成,但我沒有使它工作。 我搜索的所有結果都只顯示瞭如何對ASC或DESC進行排序,但不是我想要的結果。

此外,我必須承認,我是相對新的PHP和MySQL。
希望你們中的一些人能把我帶回正軌。
非常感謝提前。

+0

非常感謝所有的答案。 我嘗試了它們,但SoapBox是正確的,PHP做這件事非常緩慢,因爲我總是遇到內部服務器錯誤。 所以我去了,重新思考我的數據庫表,並嘗試另一種方法。 – 2010-01-15 22:40:41

回答

0

有點難以分辨,因爲這裏有很多事情要做,未來如果你問幾個簡單的問題,並找出自己如何使答案合在一起,你可能會得到更好/更多的迴應。

你最好的選擇是長期來重組你的SQL表,這樣你可以將這些查詢結合在一起。你可以在PHP中完成你所要求的工作,但這要比在MySQL中做這個要慢,而且要複雜得多。

要做到你的要求(在PHP很慢):

$sorted = array(); 
foreach ($sorting_array as $id) 
{ 
    foreach ($array_to_sort as $values) 
    { 
     if ($values['id'] == $id) 
     { 
      $sorted[] = $values; 
      break; 
     } 
    } 
} 
1

要提取您的結果:

foreach ($sorting_array as $id) { 
    // replace the print_r with your display code here 
    print_r($array_to_sort[ $id ]); 
} 

$result = mysql_query("SELECT id, name, helptxt 
    FROM table 
    WHERE id IN ($sorting_array) 
    AND language='english'"); 
$array_to_sort = array(); 
while (($row = mysql_fetch_assoc($result)) !== false) { 
    // associate the row array with its id 
    $array_to_sort[ $row[ "id" ] ] = $row; 
} 

,以便的$sorting_array顯示它們

並提供代碼提示$sorting_array

$result = mysql_query("select conf from config where user='me'", $dbi); 
$conf = mysql_fetch_array($result, $dbi); 
$temp = explode(',', $conf[0]); 
// limit to 30 ids 
$new = array(); 
// no need to do this manually, use a loop 
for ($i = 0; $i < 30; ++$i) 
    $new[] = $temp[ 0 ]; 
$sorting_array = implode(',', $new); 
0

我在這種情況下傾向於做的事情是首先用數據重新排列數組。所以按鍵,分別代表IDS
你的情況:

$array_to_sort_ids = array(); 

foreach ($array_to_sor as $item) 
{ 
    $array_to_sort_ids[$item['id']] = $item; 
} 

然後排序很簡單,只要:

$array_sorted = array(); 

foreach ($sorting_array as $id) 
{ 
    $array_sorted[] = $array_to_sort_ids[$id]; 
} 

該解決方案是非常有效的,因爲你只有2個foreach循環。

0

編輯!

,因爲我無法再編輯我的問題,我只是想說明我的解決辦法是這樣的:

重新考慮我的數據庫是什麼給我帶來了一些testings,然後我找到了解決方案,具有以下尖端查詢:

$result = sql_query("SELECT id, name, helptxt 
       FROM table 
       WHERE id IN ($sorting_array) 
       AND language='english' 
       ORDER BY FIELD(id,$sorting_array)"); 
while ($array_to_sort[] = mysql_fetch_array ($result, MYSQL_ASSOC)) {} 
array_pop($array_to_sort);#deleting the last null entry 

就行了:

ORDER BY FIELD(id,$sorting_array) 

會做的伎倆。它以您想要的方式命令結果,即使這意味着1,4,2,3,9,7,...
有時候,這很容易,當你知道在哪裏看。
再次感謝!