使用PHP + Mysql对目录中的文件进行排序

时间:2011-05-23 22:12:18

标签: php mysql

嗨!

基本上我有一个图像轮播,每个图像都动态链接到文章。 我有一个脚本读取目录,将文件名存储到一个数组中。 然后我修剪文件扩展名,通过搜索具有相同/相似名称的文章来查询数据库中我想要图像链接的文章。 例如:blets.jpg链接到皮带文章。 所以我开始工作了。

但我想做的是能够按照我的文章在订购栏中分配给他们的顺序来显示图像。

我现在拥有的图像按字母顺序显示,我要做的就是按照我分配给文章的顺序显示它们。

所以这是我的代码:

     echo "<div id='carousel'>\n";

    // Get image file name
  // open directory
  $myDirectory = opendir("./images/products/carousel/spring-summer-2011/");

  while($fileName = readdir($myDirectory))  // get each file
  {
    $dirArray[] = $fileName;
  }

  closedir($myDirectory); // close directory


  //sort($dirArray); // sort files


  echo "<div class='infiniteCarousel'>
        <div class='wrapper'>
          <ul>\n";

  foreach ($dirArray as $file)
  {
      if (substr("$file", 0, 1) != ".") //don't list hidden files
      {
      $name = substr($file, 0, strrpos($file, '.')); // trim file name extension
      $res = mysql_query("Select id, alias, ordering from content where alias like '{$name}'  ORDER BY ordering"); // order by is pretty useless here !!
              while ($row = mysql_fetch_array($res))
              {
              $id = $row['id'];
              $alias = $row['alias'];
              $ordering = $row['ordering'];

      echo "<li><a href='index.php?option=com_content&view=article&id={$id}' title='{$alias}'>\n";
      echo "<img src='./images/products/carousel/spring-summer-2011/{$file}' height='80' width='120' alt='{$alias}' />";
      echo "</a></li>\n";
              }

      }
  }

  echo "</ul>\n</div>\n</div>\n";

  echo "</div>"; //Close Carousel

我在代码中留下了我的评论。 我基本上知道需要做什么,只是不知道该怎么做。 我需要专业人士!帮助

5 个答案:

答案 0 :(得分:2)

如果我理解正确,则无需读取目录并将图像存储在数组中。

您只需查询数据库即可获得要按所需顺序显示的文章集合,并将.jpg添加到文章名称中以获取图像名称。

另一个优点是,您只需要为所有文章查询数据库一次,而不是为每篇文章单独查询。

答案 1 :(得分:2)

$Line[] = array();

foreach ($dirArray as $file)
 {
  if (substr("$file", 0, 1) != ".") //don't list hidden files
  {
  $name = substr($file, 0, strrpos($file, '.')); // trim file name extension
  $res = mysql_query("Select id, alias, ordering from content where alias like '{$name}'  ORDER BY ordering"); // order by is pretty useless here !!
          while ($row = mysql_fetch_array($res))
          {
          $id = $row['id'];
          $alias = $row['alias'];
          $ordering = $row['ordering'];

  $Line[] = "<li id='$ordering'><a href='index.php?option=com_content&view=article&id={$id}' title='{$alias}'>\n <img src='./images/products/carousel/spring-summer-2011/{$file}' height='80' width='120' alt='{$alias}' /></a></li>\n";
          }

  }
  }

sort($Line);
foreach ( $Line as $ordering => $line ) {
echo "$line";
}

答案 2 :(得分:1)

我建议您按原样获取文件名,但要单独执行查询和渲染。每次查询文件信息时,都应将该信息作为对象/数组存储到另一个数组中。完成所有查询后,您可以根据订购价值进行排序。最后,您将迭代此数组并呈现结果。

希望这有帮助,如果您需要更多具体细节,请与我们联系。

答案 3 :(得分:1)

您可以先获取数组中的所有行,然后使用usort()根据您的具体条件对其进行排序:

$rows = array();
foreach ($dirArray as $file) {
    // ...
    while ($row = mysql_fetch_array($res)) {
        $rows[] = $row;
    }
}

function my_sort($a, $b)
{
    return $a['ordering'] - $b['ordering'];
}

usort($rows, 'my_sort');

foreach ($rows as $row) {
    // display the data
}

但是,正如jeroen所建议的那样,您应该将所有查询分组为一个,这会使代码复杂化,但效率更高!

(顺便说一句,如果你只使用$ row作为关联数组,你可能也会对mysql_fetch_assoc()使用mysql_fetch_array()感兴趣。)

答案 4 :(得分:1)

好吧!!!

老鹰降落了。好的,所以我得到了AR的解决方案,没有任何障碍。

@Benjamin我也让你的工作,但我必须从foreach循环中取出功能 并将其更改为:

usort($rows, function($a, $b)
{
    return $a > $b ? 1 : -1;
});

然后它奏效了。

我从这次经历中学到了很多东西,所以我感谢大家。 你真的帮助我进一步了解数组。

现在它在我的测试服务器(LAMP)上工作正常,但是请注意,它不适用于Godaddy的服务器。哇!

和平。