Fonction qui associe un tableau a une variable

WRInaute occasionnel
Bonjour, je vais vous exposer mon problème, il est déjà solutionné; mais de manière très malsaine (en terme de code).
C'est pourquoi je me disais que l'expérience de certains d'entre vous pourrais m'aider.

Problème :

j'ai une liste de nombres commençant à 1 et se terminant à k, k est toujours supérieur à 500 , cela signifie que ma liste comporte toujours plus de 500 nombres.

je cherche à créer une fonction qui à tout n ( n est un entier compris entre 1 et k ) associe un tableau comme suit

Code:
if (($n > 5)and(n < (k-4)))
array ([n-5],[n-4],[n-3],[n-2],[n-1],n,[n+1],[n+2],[n+3],[n+4],[n+5])

le problème est si n < 5 ou si n > (k-4)
car la je dois créer des conditions pour chacun d'entre ces nombres du type : if n = 1 , if n = 2 ... if n = k if n= (k-1)...
si n = 2 par exemple , ils renvoyer un tableau de type :

Code:
array (k-3,k-2,k-1,k,1,2,3,4,5,6,7)

vous comprenez ? si n est trop petit, il dois aller chercher a la fin (vers k) , et si n est trop grand , il dois aller au début (vers 1)

donc, me direz vous c'est pas impossible de faire toutes les conditions , il y en à que 10... oui mais c'est ce que j'ai déja fait, cela fonctionne bien ma fonction connexe($n) restitue bien le bon tableau.
Mais si je veux un nombre connexe un peu plus "éloigné" de n je dois faire ceci :
Code:
$nombre = connexe($n) ; $nombre = connexe( $nombre[10]) ; $nombre = connexe( $nombre[10]) etc...
plus je veux m'éloigner de n , plus la fonction s'appelle elle même... Mais c'est gènant... voyez vous mieux ?

merci de m'aider si vous le pouvez
cordialement, mike.
 
WRInaute accro
Je te le fais en pseudo-code...

Code:
fonction intervalle(milieu,ecart,max)
{
 tableau a;
 pour chaque i de milieu-ecart à milieu+ecart
 {
   push tableau,((i-1)%max)+1;
 }
 return tableau
}

Sinon tu peux le faire en utilisant range avec 3 cas de figure, genre:
Code:
fonction intervalle(milieu,ecart,max)
{
 si milieu < ecart alors return range(max+milieu-ecart,max),range(1,milieu+ecart)
 sinon si milieu > max - ecart alors return range(milieu-ecart,max),range(1,(milieu+ecart)%max)
 sinon return range(milieu-ecart,milieu+ecart);
}

Il y a probablement des offsets +-1 à ajouter à droite à gauche (parce que tu commences à 1 au lieu de 0), j'ai un peu la flemme de réfléchir où là :-)

Jacques.
 
Nouveau WRInaute
En PHP :

Code:
function get_tableau($n, $k)
{
      $tableau = array();
      for($i=$n-5; $i<=$n+5; $i++)
           $tableau[$i-$n+5] = ($i + $k) % ($k + 1);
}

Exemple avec cet appel : get_tableau(2, 15)
Code:
$tableau[0] = (-3 + 15) % 16; // == 12 % 16 == 12
$tableau[1] = (-2 + 15) % 16; // == 13 % 16 == 13
$tableau[2] = (-1 + 15) % 16; // == 14 % 16 == 14
$tableau[3] = (0 + 15) % 16; // == 15 % 16 == 15
$tableau[4] = (1 + 15) % 16; // == 16 % 16 == 0
$tableau[5] = (2 + 15) % 16; // == 17 % 16 == 1 (<- n)
$tableau[6] = (3 + 15) % 16; // == 18 % 16 == 2
$tableau[7] = (4 + 15) % 16; // == 19 % 16 == 3
$tableau[8] = (5 + 15) % 16; // == 20 % 16 == 4
$tableau[9] = (6 + 15) % 16; // == 21 % 16 == 5
$tableau[10] = (7 + 15) % 16; // == 22 % 16 == 6
 
WRInaute occasionnel
gg00xiv a dit:
En PHP :

Code:
function get_tableau($n, $k)
{
      $tableau = array();
      for($i=$n-5; $i<=$n+5; $i++)
           $tableau[$i-$n+5] = ($i + $k) % ($k + 1);
}

Exemple avec cet appel : get_tableau(2, 15)
Code:
$tableau[0] = (-3 + 15) % 16; // == 12 % 16 == 12
$tableau[1] = (-2 + 15) % 16; // == 13 % 16 == 13
$tableau[2] = (-1 + 15) % 16; // == 14 % 16 == 14
$tableau[3] = (0 + 15) % 16; // == 15 % 16 == 15
$tableau[4] = (1 + 15) % 16; // == 16 % 16 == 0
$tableau[5] = (2 + 15) % 16; // == 17 % 16 == 1 (<- n)
$tableau[6] = (3 + 15) % 16; // == 18 % 16 == 2
$tableau[7] = (4 + 15) % 16; // == 19 % 16 == 3
$tableau[8] = (5 + 15) % 16; // == 20 % 16 == 4
$tableau[9] = (6 + 15) % 16; // == 21 % 16 == 5
$tableau[10] = (7 + 15) % 16; // == 22 % 16 == 6


mais oui, les modulos... j'avais pas pensé, merci de me mettre sur la piste, tout va devenir plus simple là, je vais étudier ca, merci pour la piste et pour le coup de pouce !!
 

➡️ Offre MyRankingMetrics ⬅️

pré-audit SEO gratuit avec RM Tech (+ avis d'expert)
coaching offert aux clients (avec Olivier Duffez ou Fabien Faceries)

Voir les détails ici

coaching SEO
Discussions similaires
Haut