PHP Сортировка ассоциативного массива по другому массиву - PullRequest
2 голосов
/ 15 января 2010

Мне нужно отсортировать ассоциативный массив в точном порядке содержимого другого массива. Массивы извлекаются двумя отдельными 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:
(поле db '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"];

Но он отсортирован по ASC "id", но мне нужна именно такая сортировка, как в $ sorting_array. Я пробовал кое-что с:

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

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

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

Ответы [ 4 ]

1 голос
/ 15 января 2010

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

$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 голосов
/ 16 января 2010

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

0 голосов
/ 15 января 2010

что я обычно делаю в такой ситуации - это сначала перегруппировать массив с данными. поэтому ключи представляют собой идентификаторы
В вашем случае:

$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 голосов
/ 15 января 2010

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

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

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

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