He creado una sencilla función que devolverá los elementos de un array separados por sus letras iniciales.
En primer lugar habría que definir el array:
$lista = array(
'Assassin\'s Creed',
'Assassin\'s Creed II',
'Command & Conquer: Red Alert 3',
'Call of Duty: World at War',
'Bayonetta',
'Dragon Age: Origins',
'50 Cent: Blood on the Sand',
'Mini Ninjas',
'Wipeout HD',
'Valkyria Chronicles'
);
Y después llamar a la función:
listadoAlfabetico($lista);
La función sería la siguiente:
function listadoAlfabetico ($lista) {
foreach (range('A', 'Z') as $letter) {
$iniciales[] = $letter;
// Añadimos letras que no están en el alfabeto inglés
if ($letter=='C') {$iniciales[] = 'Ç';}
if ($letter=='N') {$iniciales[] = 'Ñ';}
}
$i=0;$eliminar = array();
while ($i<count($iniciales)) {
$inicial = $iniciales[$i];
$htmlLetra='';
$j=0;$k=0; while ($j<count($lista)) {
if ($lista[$j]{0}==$inicial or $lista[$j]{0}==strtolower($inicial)) {
$htmlLetra .= '<li>'.$lista[$j].'</li>';
$eliminar[] = $j;
$k++;
}
$j++;
}
// Si hay elementos con la inicial actual se eliminan del array y se genera el HTML
if ($k>0) {
rsort($eliminar);
$l=0; while ($l<count($eliminar)) {
$lista = quitarElemento($lista, $eliminar[$l]);
$l++;
}
$html .= '<p>'.$inicial.'</p><ul>'.$htmlLetra.'</ul>';
}
$eliminar = array();
$i++;
}
// Con el resto de elementos se saca el apartado del 0 al 9
if (count($lista)>0) {
$htmlLetra='';
$m=0; while ($m<count($lista)) {
$selTag='span'; if ($_GET['cliente']==$lista[$m][0]) {$selTag='strong';}
$htmlLetra .= '<li>'.$lista[$m].'</li>';
$m++;
}
$html .= '<p>0-9</p><ul>'.$htmlLetra.'</ul>';
}
return $html;
}
function quitarElemento($elementos, $indice) {
if (is_array($elementos)) {
unset($elementos[$indice]);
if(gettype($indice)!="string") {
$listaTemporal=array();
$i=0;
foreach ($elementos as $value) {
$listaTemporal[$i]=$value;
$i++;
}
$elementos=$listaTemporal;
}
return $elementos;
}
else {return false;}
}
Se puede ver el ejemplo o descargarlo (texto plano).