foreach in foreach,我能更高效吗?

时间:2011-05-07 14:35:43

标签: php loops nested-loops

我有一个字母数组,用于创建标题并从我的数据库中对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;
        }
   }
}

这很有效,但我觉得可以通过改进来提高速度。

4 个答案:

答案 0 :(得分:1)

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

只要每个项目都知道它应该具有哪种类型的标头,就不需要遍历标头。

  1. 根据标题对项目进行排序
  2. 遍历您的商品并检查每个商品的标题类型
  3. 如果尚未添加该类型的标题,则在添加项目之前添加它。

答案 1 :(得分:1)

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

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

usort($list, 'my_sort');

答案 2 :(得分:1)

单循环,更灵活的第一个字符逻辑:

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];
}

答案 3 :(得分:0)

我认为是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;
  }
}