2010-01-15 2 views
2

Мне нужно отсортировать ассоциативный массив в точном порядке содержимого другого массива. Массивы извлекаются двумя отдельными sql-запросами (указано ниже). Запросы не могут быть объединены только с одним запросом, поэтому мне нужно отсортировать второй массив в порядке первого.PHP Сортировка ассоциативного массива другим массивом

Эти массивы:

#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:
(ДБ-поле 'конф' настроен как "текст", может быть, это мой проблема с тем, что я должен первым взрываются и лопаются записи, прежде чем я мог бы использовать его для следующего запроса)

$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"]; 

Но сортируются по «ид» ASC, но мне нужно точно сортировка, как и в $ sorting_array. я попробовал некоторые вещи:

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

, которая только приносит идентификаторы в правильном порядке, но не содержание. Теперь я немного смущен, так как я пробовал так много всего, но все закончилось тем, что дали мне те же результаты.
Возможно, sql-запрос может быть выполнен за один шаг, но я не привел его к работе. Все результаты моих поисков только показали, как сортировать ASC или DESC, но не то, что я хочу.

Кроме того, я должен признаться, что я относительно новый для PHP и MySQL.
Надеюсь, кто-то из вас может вернуть меня в нужное русло.
Большое спасибо заранее.

+0

Большое спасибо за ответы. Я пробовал их, но SoapBox прав, что PHP очень медленно делает это, так как я всегда сталкиваюсь с внутренней ошибкой сервера. Итак, я перехожу и переосмысливаю свои таблицы базы данных и пробую другой подход. –

ответ

0

Его немного сложно сказать, потому что здесь многое происходит, в будущем вы, вероятно, получите больше/больше ответов, если зададите несколько простых вопросов и выясните, как сделать ответы подходящими вместе.

Ваш лучший выбор в долгосрочной перспективе - это перестроить SQL tablessuch, чтобы вы могли объединить эти запросы вместе. Вы можете делать то, что вы просите в PHP, но это будет медленнее, чем делать это в MySQL и намного сложнее.

Для того, чтобы сделать то, что вы просите (довольно медленно в PHP):

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

Чтобы получать результаты:

$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:

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

И бонус для получения кода $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

То, что я обычно делаю в такой ситуации, заключается в том, чтобы перенести массив с данными. так что ключи представляют собой идентификаторы
В вашем случае:

$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

EDIT !!!

Как я не мог изменить мой вопрос больше, я просто хотел бы заявить, что мое решение так:

жала, чтобы пересмотреть мою базу данных было то, что привело меня к некоторым тестирований, а затем я нашел решение, со следующими запрос:

$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, ...
Иногда это так просто, когда вы знаете, где искать.
Еще раз спасибо !!!

Смежные вопросы