IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Pagination intelligente sur array


Sujet :

Langage PHP

  1. #1
    Invité
    Invité(e)
    Par défaut Pagination intelligente sur array
    Bonjour à tous !

    Je possède une sortie de tableau avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
                [Pages] => Array
                    (
                        [1] => 0
                        [2] => 5
                        [3] => 10
                        [4] => 15
                        [5] => 20
                        [6] => 25
                        [7] => 30
                        [8] => 35
                        [9] => 40
                        [10] => 45
                        [11] => 50
                        [12] => 55
                        [13] => 60
                        [14] => 65
                        [15] => 70
                        [16] => 75
                        [17] => 80
                        [18] => 85
                        [19] => 90
                        [20] => 95
                        [21] => 100
                        [22] => 105
                        [23] => 110
                        [24] => 115
                        [25] => 120
                    )
    J'affiche bien mon système de pagination qui me sort très bien tout mon contenu tel que :
    < 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 >

    Le seul hic c'est que je ne peux pas afficher autant de pages sur mon menu pagination.
    j'aimerai avoir une copie de ce tableau qui sortirai avec des conditions :

    si plus de 10 pages dans le tableau alors afficher sur ce principe :

    < 1 2 3 4 5 ... 21 22 23 24 25 >

    sachant que si je suis à la page active 10 par exemple, il faudrai toujours pouvoir revenir du genre :

    < 1 2 ... 8 9 10 11 12 ... 24 25 >

    Un truc dans ce genre la quoi !

    Quelqu'un aurai-t-il une solution miracle à mon dilem ?

    Merci beaucoup pour votre aide

  2. #2
    Membre émérite Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 023
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 023
    Points : 2 273
    Points
    2 273
    Par défaut
    Salut,
    Tu peux montrer ton code d'affichage ? Est-ce que tu te sers des valeurs du tableaux pour passer en paramètre d'un lien ?
    Parce qu'en fait là ton tableau me semble inutile

  3. #3
    Invité
    Invité(e)
    Par défaut
    Si si il m'est utile car c'est un tableau provisoire !

    Je pense avoir trouver mon bonheur avec la fonction array_slice()

    je vais tester ça

    en fait je vais faire une sortie de 11 valeurs depuis mon tableau en fonction de la page en cours ! si c'est la page 16 par exemple array_slice me ressortira :

    < 11 12 13 14 15 16 17 18 19 20 21 >

  4. #4
    Membre émérite Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 023
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 023
    Points : 2 273
    Points
    2 273
    Par défaut
    ce que je voulais dire c'est que le tableau tient en 2 variables :
    $pagesCount = 25;
    $step = 5;

    Sinon pour le problème, finalement c'est assez chaud, 20min que je suis dessus mais pas trouvé de soluce convenable

  5. #5
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    178
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 178
    Points : 93
    Points
    93
    Par défaut
    Bonjour,

    autrement tu peux utiliser le module Pager de PEAR. Il est très simple d'utilisation, et tu retrouveras des exemples d'utilisation de code.
    Il remplit toutes les fonctionnalités dont tu as besoin.

  6. #6
    Membre régulier
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    178
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 178
    Points : 93
    Points
    93
    Par défaut
    en cadeau bonus (c'est pas extrait de Pager hein, mais de mon cerveau)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    <?php
    ###############
    #### logic ####
    ###############
     
    function getClosestInferiorOddInt($int) {
    	return ((int)$int%2 == 0)? (int)$int-1:(int)$int;
    }
     
    /**
     * "Converts" an array into a summarized pagination
     * @param $array associative array (page number (1..n) => value) 
     * @param $current_page current page index
     * @param $number_permanent_pages number of pages displayed at the beginning AND the end 
    		(ex: $array length = 25, $number_permanent_pages = 2, we'll have for sure 1 2 and 24 25)
     * @param $max_pages_displayed max. number of pages displayed (if the number is even, it is actually max+1)
     * @return $pages array of pages to be displayed
     */
    function getPagination($array, $current_page, $number_permanent_pages=2, $max_pages_displayed=11) {
    	//pages to be displayed
    	$pages = array();
    	$length_input = count($array);
    	if($length_input <= $max_pages_displayed || 2*$number_permanent_pages >= $length_input) {
    		$pages = $array;#nothing to do
    	}	
    	else {
    		//last page of the first permament pages (left side)
    		$minimum_interval = $number_permanent_pages;
    		//first page of the last permament pages (right side)
    		$maximum_interval = $length_input-$number_permanent_pages+1;
    		//$number_permanent_pages first values in the array
    		for($i=1;$i <=$minimum_interval;$i++) {
    			$pages[$i] = $array[$i];
    		}
    		$amplitude = (getClosestInferiorOddInt($max_pages_displayed)-2*$number_permanent_pages+1)/2-1;
    		//loop
    		for($index=$amplitude; $index>=-$amplitude; $index--) {
    			//if no overlap with permanent pages, then, we add the page to the array
    			if(($current_page-$index > $minimum_interval) && ($current_page-$index < $maximum_interval)) {	
    				$pages[$current_page-$index] = $array[$current_page-$index];
    			}
    		}
    		//$number_permanent_pages last values in the array
    		for($i=$maximum_interval;$i<=$length_input;$i++) {
    			$pages[$i] = $array[$i];
    		}
    	}
    	return $pages;
    }
     
     
     
    ##############
    #### demo ####
    ##############
     
    ## change parameters here ##
    $length_input_array = 25;
    $current_page = isset($_GET['page'])?intval($_GET['page']):rand(1,$length_input_array);
    $max_pages_displayed = 11;
    $permanent_pages = 2;
     
    //init input array
    for($i=1;$i<=$length_input_array;$i++) {
    	$array[$i] = ($i-1)*5;
    }
    //pagination
    $pages = getPagination($array,$current_page,$permanent_pages,$max_pages_displayed);//2 last parameters are optional
     
     
     
    ## display ##
    echo '<strong>Input array</strong><br /> '; 
    echo 'Length: <strong>'.$length_input_array.'</strong><br />';
    echo 'Contents: '; print_r($array); echo '<hr />';
    echo 'You will see the <strong>'.$permanent_pages.'</strong> first and last page(s).<br />';
    echo 'You will never see more than <strong>'.$max_pages_displayed.'</strong> displayed pages.<br/>';
    echo 'Current page is: <strong>'.$current_page.'</strong>.<br />';
    echo 'Pages: ';
    $last_index = null;
    foreach($pages as $page_index => $value_not_used_for_demo) {
    	$dots = '';
    	if($last_index != null && $last_index != $page_index-1) {
    		$dots = ' ...';
    	}
    	echo $dots.' <a href="?page='.$page_index.'">'.$page_index.'</a>';
    	$last_index = $page_index;
    }
     
    echo '<br /><br />Current value: <strong>'.$pages[$current_page].'</strong>';
    lis les commentaires, teste ce code, joue avec les paramètres... tu verras qu'il y a encore des vérifications à faire, notamment si tu mets des valeurs absurdes (nombres négatifs, chaînes de caractère), mais je te laisse le soin de parfaire ce petit script

    en revanche, ça répond aux besoins de ton premier post (tels que je les ai compris), pas de ton post suivant...

Discussions similaires

  1. [Tableaux] operation sur array, comparaison, addition
    Par frn8cky dans le forum Langage
    Réponses: 4
    Dernier message: 13/10/2007, 10h15
  2. [Tableaux] Une recherche sur arrays imbriqués
    Par hpl76 dans le forum Langage
    Réponses: 6
    Dernier message: 26/06/2007, 18h43
  3. [Tableaux] Explode() sur Array ?
    Par bat2504 dans le forum Langage
    Réponses: 3
    Dernier message: 11/04/2007, 14h32
  4. [PHP/SQL] foreach sur array multiples
    Par Flushovsky dans le forum Langage
    Réponses: 1
    Dernier message: 18/09/2006, 10h49
  5. pb sur ARRAY
    Par heleneh dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 07/09/2005, 09h58

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo