web-dev-qa-db-fra.com

Comment définir un pointeur interne de tableaux sur une position spécifique? PHP/XML

J'essaie de construire un petit site en utilisant XML au lieu d'une base de données. 

J'aimerais créer un bouton next et prev qui fonctionnera par rapport au contenu que j'ai affiché.

J'ai trouvé la fonction php next () et prev () ainsi que current () mais je ne sais pas comment définir le pointeur sur une position spécifique pour pouvoir naviguer par rapport à la page en cours.

$list=array('page1','page2','page3')

par exemple, si je suis en train d'afficher le contenu de la page2, comment pourrais-je dire à php que je suis à $ list [1], de sorte que next ($ list) affiche page3?

Merci d'avance

35
chris

Si votre tableau est toujours indexé de manière cohérente (par exemple, 'page1' est toujours à l'index '0'), c'est assez simple:

$List = array('page1', 'page2', 'page3', 'page4', 'page5');
$CurrentPage = 3; // 'page4'

while (key($List) !== $CurrentPage) next($List); // Advance until there's a match

Personnellement, je ne me fie pas à l'indexation automatique, car il est toujours possible que l'index automatique change. Vous devriez envisager de définir explicitement les clés:

$List = array(
    '1' => 'page1',
    '2' => 'page2',
    '3' => 'page3',
);

EDIT: Si vous voulez tester les valeurs du tableau (au lieu des clés), utilisez current() :

while (current($List) !== $CurrentPage) next($List);
34
matpie

En utilisant les fonctions ci-dessous, vous pouvez obtenir le suivant et précédent  valeurs du tableau ..__ si courant valeur n'est pas valide ou c'est le dernier (premier - pour prevvaleur dans le tableau, alors: 

  • la fonction getNextVal (...) renvoie le premier valeur de l'élément
  • la fonction getPrevVal (...) renvoie le dernier valeur de l'élément

Les fonctions sont cycliques.

function getNextVal(&$array, $curr_val)
{
    $next = 0;
    reset($array);

    do
    {
        $tmp_val = current($array);
        $res = next($array);
    } while ( ($tmp_val != $curr_val) && $res );

    if( $res )
    {
        $next = current($array);
    }

    return $next;
}

function getPrevVal(&$array, $curr_val)
{
    end($array);
    $prev = current($array);

    do
    {
        $tmp_val = current($array);
        $res = prev($array);
    } while ( ($tmp_val != $curr_val) && $res );

    if( $res )
    {
        $prev = current($array);
    }

    return $prev;
}
6
Andrei

Le pointeur de tableau interne est principalement utilisé pour boucler un tableau dans un script PHP. Je ne recommanderais pas de l'utiliser pour passer d'une page à l'autre.

Pour cela, il suffit de garder trace du numéro de page et de la taille de la page (nombre d’éléments par page). Ensuite, lorsque vous chargez une autre page, vous pouvez les utiliser pour choisir les éléments du tableau à afficher. Par exemple:

$pageNum = $_GET["pageNum"];
$pageSize = 10;
$startIndex = ($pageNum - 1) * $pageSize;
$endIndex = ($startIndex + $pageSize) - 1;

(ou quelque chose de similaire)

2
JW.

une autre approche sans boucles ni recherche.

list($prev,$next) = getPrevNext($oObjects,$sCurrentKey);

function getPrevNext($aArray,$key){
    $aKeys = array_keys($aArray); //every element of aKeys is obviously unique
    $aIndices = array_flip($aKeys); //so array can be flipped without risk
    $i = $aIndices[$key]; //index of key in aKeys
    if ($i > 0) $prev = $aArray[$aKeys[$i-1]]; //use previous key in aArray
    if ($i < count($aKeys)-1) $next = $aArray[$aKeys[$i+1]]; //use next key in aArray
    return array($prev,$next);
}
2
tjungcl

En utilisant les fonctions ci-dessous, vous pouvez obtenir le suivant et précédent  Clés du tableau ..__ si courant clé n'est pas valide ou c'est le dernier (premier - pour prevclé dans le tableau, alors: 

  • la fonction getNext (...) renvoie 0 (le premier élément clé)
  • la fonction getPrev (...) renvoie le clé du dernier élément du tableau

Les fonctions sont cycliques.

function getNext(&$array, $curr_key)
{
    $next = 0;
    reset($array);

    do
    {
        $tmp_key = key($array);
        $res = next($array);
    } while ( ($tmp_key != $curr_key) && $res );

    if( $res )
    {
        $next = key($array);
    }

    return $next;
}

function getPrev(&$array, $curr_key)
{
    end($array);
    $prev = key($array);

    do
    {
        $tmp_key = key($array);
        $res = prev($array);
    } while ( ($tmp_key != $curr_key) && $res );

    if( $res )
    {
        $prev = key($array);
    }

    return $prev;
}
2
Andrei

J'utilise ce code pour définir le pointeur interne avec la clé du tableau.

reset($List);
while (key($List) !== $id && key($List) !== null) next($List);
if(key($List) === null) end($List);

Après cela, vous pouvez utiliser prev () ou next ().

Suivre la notification de @VaclavSir

1
EThaizone Jo

Essaye ça

 public function getNextVal(&$array, $curr_val){

    foreach($array as $k=>$v){
        if($v['your_key'] == $curr_val){
            if(isset($array[$k+1]))
                return $array[$k+1];
            else
                return $array[0];
        }
    }

}

public function getPrevVal(&$array, $curr_val){

    foreach($array as $k=>$v){
        if($v['your_key'] == $curr_val){
            if(isset($array[$k-1]))
                return $array[$k-1];
            else
                return end($array);
        }
    }
}

pour tableau comme ceci:

array (size=3)
0 => 
array (size=11)
  'id' => string '21' (length=2)
  'cat' => string '1' (length=1)
  'gal' => string '1' (length=1)
  'type' => string 'image' (length=5)
  'name' => string 'chalk_art_dies-irea_2nd_pic' (length=27)
  'permalink' => string 'chalk-art-dies-irea-2nd-pic' (length=27)
  'url' => string 'rxNsPoEiJboJQ32.jpg' (length=19)
  'content' => string '' (length=0)
  'date' => string '1432076359' (length=10)
  'order' => string '20' (length=2)
  'views' => string '0' (length=1)
 1 => 
   array (size=11)
  'id' => string '10' (length=2)
  'cat' => string '1' (length=1)
  'gal' => string '1' (length=1)
  'type' => string 'image' (length=5)
  'name' => string '3dchalkart' (length=10)
  'permalink' => string '3dchalkart' (length=10)
  'url' => string 's57i5DKueUEI4lu.jpg' (length=19)
  'content' => string '' (length=0)
  'date' => string '1432076358' (length=10)
  'order' => string '9' (length=1)
  'views' => string '0' (length=1)
  2 => 
0
Burhan Ibrahimi