¿Cómo configurar un puntero interno de Arrays en una posición específica? PHP/XML

Resuelto chris asked hace 54 años • 9 respuestas

Estoy intentando crear un pequeño sitio utilizando XML en lugar de una base de datos.

Me gustaría crear un botón siguiente y anterior que funcionen en relación con el contenido que he mostrado.

Encontré la función php next() y prev() así como current() pero no sé cómo configurar el puntero en una posición específica para poder navegar en relación con la página actual.

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

por ejemplo, si estoy mostrando el contenido de la página 2, ¿cómo podría decirle a php que estoy en $list[1] para que next($list) muestre la página3?

gracias de antemano

chris avatar Jan 01 '70 08:01 chris
Aceptado

Si su matriz siempre está indexada de manera consistente (por ejemplo, 'página1' siempre está en el índice '0'), es bastante simple:

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

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

Personalmente, no confío en la indexación automática porque siempre existe la posibilidad de que el índice automático cambie. Deberías considerar definir explícitamente las claves:

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

EDITAR: si desea probar los valores de la matriz (en lugar de las claves), use current():

while (current($List) !== $CurrentPage) next($List);
matpie avatar Apr 27 '2009 23:04 matpie

Usando las funciones siguientes, puede obtener los valores anterior y siguiente de la matriz. Si el valor actual no es válido o es el último valor ( primero , para anterior ) en la matriz, entonces:

  • la función getNextVal(...) devuelve el valor del primer elemento
  • la función getPrevVal(...) devuelve el último valor del elemento

Las funciones son cíclicas.

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;
}
Andrei Krivoshei avatar Nov 09 '2010 12:11 Andrei Krivoshei

Usando las funciones siguientes, puede obtener las CLAVE siguientes y anteriores de la matriz. Si la clave actual no es válida o es la última ( primera , para anterior ) clave en la matriz, entonces:

  • la función getNext(...) devuelve 0 (la clave del primer elemento )
  • la función getPrev(...) devuelve la clave del último elemento de la matriz

Las funciones son cíclicas.

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;
}
Andrei Krivoshei avatar Nov 09 '2010 12:11 Andrei Krivoshei

otro enfoque sin bucles ni búsqueda.

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);
}
tjungcl avatar Nov 28 '2011 09:11 tjungcl