recorrer - ¿Cómo establecer un puntero interno de matrices en una posición específica? PHP/XML
modificar elemento de un array php (8)
Estoy tratando de construir un sitio pequeño usando XML en lugar de una base de datos.
Me gustaría construir un botón siguiente y anterior que funcione 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 a 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 visualizando contenidos de la página 2, ¿cómo podría decirle a php que estoy en $ list [1] para que el próximo ($ list) muestre la página3?
Gracias por adelantado
Aquí está el enfoque completo de @tjunglc con looping:
protected 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
if (!isset($prev)) $prev = end($aArray);
if (!isset($next)) $next = reset($aArray);
return array($prev,$next);
}
Ah, y gracias @tjunglc por esto :)
El puntero de matriz interno se utiliza principalmente para recorrer una matriz dentro de un script PHP. No recomendaría usarlo para pasar de una página a otra.
Para eso, solo haga un seguimiento del número de página y el tamaño de página (número de elementos por página). Luego, cuando está cargando otra página, puede usarla para decidir qué elementos de la matriz mostrar. Por ejemplo:
$pageNum = $_GET["pageNum"];
$pageSize = 10;
$startIndex = ($pageNum - 1) * $pageSize;
$endIndex = ($startIndex + $pageSize) - 1;
(o algo similar)
Prueba esto
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);
}
}
}
para una matriz como esta:
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 =>
Si su matriz siempre está indexada de forma coherente (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. Debe 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 a continuación, puede obtener las LLAVES siguiente y anterior de la matriz. Si la clave actual no es válida o es la última ( primera - para previa ) clave en la matriz, entonces:
- la función getNext (...) devuelve 0 (la primera tecla del elemento)
- la función getPrev (...) devuelve la clave del último elemento de 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;
}
Usando las funciones a continuación, puede obtener los valores siguientes y anteriores de la matriz. Si el valor actual no es válido o es el último ( primero para el anterior ) valor en la matriz, entonces:
- la función getNextVal (...) devuelve el primer valor del 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;
}
Uso este código para establecer el puntero interno con la clave de la matriz.
reset($List);
while (key($List) !== $id && key($List) !== null) next($List);
if(key($List) === null) end($List);
Después de eso, puede usar prev () o next ().
Actualizar aviso de seguimiento de @VaclavSir
otro enfoque sin bucles o 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);
}