我有一个字母数组,用于创建标题并从我的数据库中对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;
}
}
}
这很有效,但我觉得可以通过改进来提高速度。
答案 0 :(得分:1)
首先应该使用最长索引循环遍历数组,在大多数语言中,外循环索引增加最快。
只要每个项目都知道它应该具有哪种类型的标头,就不需要遍历标头。
答案 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;
}
}