0

我正在使用 PHP 通过对数据库表进行 preg_match_all 搜索来生成对文本的引用列表。这是PHP代码:

$query = "SELECT primary_tag,display_short_title,content FROM topics;";
$result = mysql_query($query) or die("Query failed : " . mysql_error());
$num_results = mysql_num_rows($result);
for ($i = 0; $i < $num_results; $i++) {
  $row = mysql_fetch_array($result);
  if (preg_match_all("/(\<i\>U\<\/i\>|U) [0-9]{1,2}\.[0-9]{1,7}/", $row["content"], $matches)) {
    foreach ($matches[0] as $match) {
    $match = ltrim(strip_tags($match), "U ");
    echo '<p class="textmark_result">' . $match;
    echo '  <a href="../Essays/topic.php?shorttitle=' . $row["primary_tag"] . '">' . $row["display_short_title"] . '</a>';
    echo "</p>\n";
    }
  }
}

结果(查看源代码)如下所示:

<p class="textmark_result">15.1737  <a href="../Essays/topic.php?shorttitle=medicine">Medicine</a></p>
<p class="textmark_result">5.678  <a href="../Essays/topic.php?shorttitle=science">Science</a></p>
<p class="textmark_result">14.665  <a href="../Essays/topic.php?shorttitle=science">Science</a></p>

在生成的网页中,我想按中间的小数(代码中的 $match)对结果进行排序,这样(在本例中)首先出现 5.678,然后是 14.665,然后是 15.1737。有没有办法做到这一点?

谢谢!

4

1 回答 1

0

三个步骤来做:

  1. 获取所有匹配项并将它们添加到数组中 -floatval($match)是关键。
  2. 按键对结果数组进行排序(浮点数按数值排序,字符串按字符排序 - 因此floatval(...))。
  3. 迭代排序后的数组

代码:

// MySQL stuff goes here ...
// create empty array
$results = array();
for ($i = 0; $i < $num_results; $i++) {
    $row = mysql_fetch_array($result);
    if (preg_match_all("/(\<i\>U\<\/i\>|U) [0-9]{1,2}\.[0-9]{1,7}/", $row["content"], $matches)) {
        foreach ($matches[0] as $match) {
            $match = ltrim(strip_tags($match), "U ");
            // array pseudo key is the float value of $match
            // add '_key' member for usort()
            $row['_key'] = floatval($match);
            $results[] = $row;
        }
    }
}
// sort the array by the float key
usort($results, function($a, $b) {
    if($a['_key'] == $b['_key']) return 0;
    elseif($a['_key'] > $b['_key']) return 1;
    else return -1;
});

// ... then display stuff in order
foreach($results as $row) {
    echo '<p class="textmark_result">' . (string)$row['_key'];
    echo '  <a href="../Essays/topic.php?shorttitle=' 
    . $row["primary_tag"] . '">' . $row["display_short_title"] . '</a>';
    echo "</p>\n";
}
于 2013-05-09T14:20:25.297 回答