Предполагая, что все эти записи входят в массив, а заголовки пишутся с большой буквы, вы можете сделать следующее:
$entries = array(...); // the original entries
sort($entries);
$alphabetized = array();
foreach (range('A', 'Z') as $letter) {
$alphabetized[$letter] = array();
}
foreach ($entries as $entry) {
array_unshift($alphabetized[$entry[0]], $entry);
}
Единственная проблема этого алгоритма состоит в том, что он будет алфавитизировать что-то вроде "Матрицы" под буквой Т вместо М. Но, по крайней мере, это начало.
Обновление:
Вот код, который я сделал для обработки «The» и «A»:
<?php
$entries = array(
array('title' => 'Much Ado About Nothing'),
array('title' => 'Star Wars'),
array('title' => 'The Tempest'),
array('title' => 'A Wrinkle In Time'),
array('title' => 'Star Trek'),
array('title' => 'The'),
array('title' => 'A')
);
function shamil_title_compare($a, $b) {
return strcasecmp($a['title'], $b['title']);
}
usort($entries, 'shamil_title_compare');
$alphabetized = array();
foreach (range('A', 'Z') as $letter) {
$alphabetized[$letter] = array();
}
foreach ($entries as $entry) {
$title = $entry['title'];
$firstWord = strtok($title, ' ');
if (!in_array($firstWord, array('The', 'A'))) {
$alphabetized[$firstWord[0]][] = $entry;
} else {
$nextWord = strtok(' ');
if ($nextWord !== false) {
$alphabetized[$nextWord[0]][] = $entry;
} else {
$alphabetized[$firstWord[0]][] = $entry;
}
}
}
Обновление 2
Я обновил свой код для вывода алфавитного списка в неупорядоченный список HTML:
<?php
$entries = array(
array('title' => 'Much Ado About Nothing'),
array('title' => 'Star Wars'),
array('title' => 'A Quantum of Solace'),
array('title' => 'The Tempest'),
array('title' => 'Cat Attack'),
array('title' => 'A Wrinkle In Time'),
array('title' => 'Star Trek'),
array('title' => 'The Cat'),
array('title' => 'Wicked Witch of the West'),
);
// Build a copy of the original, but strip "The" and "A", and lowercase it.
$sort = array();
foreach ($entries as $index => $array)
{
$title = strtoupper($array['title']);
list($head, $tail) = explode(' ', $title, 2);
if (($head !== 'A') and ($head !== 'THE'))
{
$sort[] = $title;
}
else if ($tail != '')
{
$sort[] = $tail;
}
else
{
$sort[] = $head;
}
}
array_multisort($sort, SORT_ASC, SORT_STRING, $entries);
$alphabetized = array();
foreach (range('A', 'Z') as $letter)
{
$alphabetized[$letter] = array();
}
foreach ($sort as $index => $title)
{
$letter = $title[0];
$alphabetized[$letter][] = $entries[$index];
}
// Output as html
foreach ($alphabetized as $letter => $entries)
{
echo "<h3>{$letter}</h3>", PHP_EOL,
"<ul>", PHP_EOL;
foreach ($entries as $entry)
{
echo "<li>{$entry['title']}</li>", PHP_EOL;
}
echo "</ul>", PHP_EOL;
}