Ti conviene usare il comando ksort con cui l'array che hai viene ordinato per ordine crescente sulle chiavi.
A questo punto ti fai uno scriptino che può essere simile a questo.
Supponiamo ke il tuo array si chiami prova mentre il tuo valore di cui trovare il precedente ed il successivo $tuo_valore.
ksort($prova);
$prec = 0;
$succ = 0;
//Prenediamo il valore immediatamente prima
foreach($prova as $ind->$elem)
{
if ($ind < $tuo_valore) $prec = $elem;
else break; //Siccome l'array è ordinato sulla chiave vuol dire che da questo punto in poi tutte le chiavi saranno maggiori di $tuo_valore
}
//Prenediamo il valore immediatamente dopo
foreach($prova as $ind->$elem)
{
if ($ind > $tuo_valore)
{
//Non appena incontriamo il primo valore + grande di $tuo_valore quello è il successivo e, quindi, terminiamo il ciclo
$succ = $elem;
break;
}
}
In base ai valori di $prec e $succ puoi avere le seguenti 4 combinazioni:
$prec = 0 && $succ != 0 c'è solo il successivo;
$prec != 0 && $succ = 0 c'è solo il precedente;
$prec != 0 && $succ != 0 ci sono entrambi;
$prec = 0 && $succ = 0 può accadere solo se l'array è vuoto.
Può nascere un problema se per caso come elemento dell'array prec o succ vi sia proprio il valore ZERO. Se questa possibilità esiste allora dobbiamo fare una piccola modifica:
ksort($prova);
$find_prec = false;
$find_succ = false;
//Prenediamo il valore immediatamente prima
foreach($prova as $ind->$elem)
{
if ($ind < $tuo_valore)
{
$find_prec = true;
$prec = $elem;
}
else break; //Siccome l'array è ordinato sulla chiave vuol dire che da questo punto in poi tutte le chiavi saranno maggiori di $tuo_valore
}
//Prenediamo il valore immediatamente dopo
foreach($prova as $ind->$elem)
{
if ($ind > $tuo_valore)
{
//Non appena incontriamo il primo valore + grande di $tuo_valore quello è il successivo e, quindi, terminiamo il ciclo
$find_succ = true;
$succ = $elem;
break;
}
}
Quindi le 4 combinazioni saranno:
$find_prec = false && $find_succ = true c'è solo il successivo;
$find_prec = true && $find_succ = false c'è solo il precedente;
$prec = true && $succ = true ci sono entrambi;
$prec = fasle && $succ = false può accadere solo se l'array è vuoto.