¿Cómo configurar un puntero interno de Arrays en una posición específica? PHP/XML
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
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);
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;
}
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;
}
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);
}