foreach 嵌套在 foreach 中,我可以提高效率吗?

发布于 2024-11-05 11:48:39 字数 524 浏览 2 评论 0原文

我有一个字母数组,用于创建标题并对数据库中的 listItems 数组进行排序。我现在所拥有的是:

$alph = array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z');                        
foreach($alph as $data) {
   echo  "<h3 id=" . $data .">" . $data . "</h3><br />";
   foreach($list as $listItem) {
    if(strtolower(substr($listItem->title, 0, 1)) === $data) {
        echo $listItem;
        }
   }
}

这很有效,但我觉得可能可以进行改进以提高速度。

I have an array of letters that are used to create a header and sort an array of listItems from my database. What i have right now is:

$alph = array('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z');                        
foreach($alph as $data) {
   echo  "<h3 id=" . $data .">" . $data . "</h3><br />";
   foreach($list as $listItem) {
    if(strtolower(substr($listItem->title, 0, 1)) === $data) {
        echo $listItem;
        }
   }
}

This works great but I feel there may be improvements that can be made to increase speed.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

╰沐子 2024-11-12 11:48:39

您应该首先循环遍历具有最长索引的数组,在大多数语言中,外循环索引增加最快。

此外,只要每个项目知道它应该具有什么类型的标题,就不需要循环遍历标题。

  1. 根据标题
  2. 对项目进行排序 循环浏览项目并检查每个项目的标题类型
  3. 如果尚未添加该类型的标题,请在添加项目之前添加它。

You should loop through the array with the longest index first, in most languages the outer loop index increases the quickest.

Also there is no need to loop through the headers as long as each item knows what type of header it should have.

  1. Sort your items according to their header
  2. Loop through your items and check the header type of each item
  3. If no header of that type has been added yet, then add it before adding the item.
滿滿的愛 2024-11-12 11:48:39

在开始之前对 $list 进行排序。这样您就可以获得实现的排序算法的效率(在 PHP 中,它是快速排序,它的性能比您当前的解决方案好得多)。

function my_sort($a, $b) {
  return strcmp(strtolower($a->title), strtolower($b->title));
}

usort($list, 'my_sort');

Sort $list before you start. That way you get the effiency of the implemented sorting algorithm (in PHP, it's quicksort, which performs a lot better than your current solution).

function my_sort($a, $b) {
  return strcmp(strtolower($a->title), strtolower($b->title));
}

usort($list, 'my_sort');
探春 2024-11-12 11:48:39

单循环,更灵活的首字符逻辑:

sort( $list );
$lastChar = '';

for ( $i = 0; $i < count( $list ); $i++ )
{
    $char = strtolower( substr( $list[$i], 0, 1 ) );
    if ( $char != $lastChar )
    {
        echo "<h3 id=" . $char .">" . $char . "</h3><br />";
        $lastChar = $char;
    }

    echo $list[$i];
}

Single loop, and more flexible first-character logic:

sort( $list );
$lastChar = '';

for ( $i = 0; $i < count( $list ); $i++ )
{
    $char = strtolower( substr( $list[$i], 0, 1 ) );
    if ( $char != $lastChar )
    {
        echo "<h3 id=" . $char .">" . $char . "</h3><br />";
        $lastChar = $char;
    }

    echo $list[$i];
}
森罗 2024-11-12 11:48:39

我认为解决方案是 O(n),但使用 php 哈希数组作弊:

// create empty index
$index = array_fill_keys(range('a', 'z'), array());
// index items by first letter
foreach ($list as $it) {
  $index[strtolower(substr($it->title, 0, 1))][] = $it;
}
// print all
foreach ($index as $letter => $items) {
  echo "<h3 id='$letter'>$letter</h3>";
  foreach ($items as $it) {
    echo $it;
  }
}

Solution that is O(n) i think, but cheats with php hash arrays:

// create empty index
$index = array_fill_keys(range('a', 'z'), array());
// index items by first letter
foreach ($list as $it) {
  $index[strtolower(substr($it->title, 0, 1))][] = $it;
}
// print all
foreach ($index as $letter => $items) {
  echo "<h3 id='$letter'>$letter</h3>";
  foreach ($items as $it) {
    echo $it;
  }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文