PHP按另一个数组排序关联数组

时间:2010-01-15 16:54:59

标签: php arrays associative-array

我需要按照另一个数组内容的确切顺序对关联数组进行排序。 数组由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-Queries:
用于$ sorting_array的SQL-Ouery:
(db-field'conf'被设置为“text”,也许这是我的问题所以我必须首先爆炸并内爆条目才能将它用于下一个查询。)

$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);

$ array_to_sort的SQL-Ouery:

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

只会以正确的顺序显示Id,而不是内容。现在我有点困惑,因为我尝试了很多东西,但最终都给了我相同的结果 也许sql-query可以一步完成,但我没有把它带到工作中。 我搜索的所有结果都显示了如何对ASC或DESC进行排序,但不是我想要的结果。

此外,我必须承认我对PHP和MySQL相对较新 希望你们中的一些人能够让我重回正轨 非常感谢提前。

4 个答案:

答案 0 :(得分: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);

答案 1 :(得分: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;
         }
    }
}

答案 2 :(得分: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循环。

答案 3 :(得分: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,...
当你知道在哪里看时,它有时很容易 再次感谢!!!