Как установить внутренний указатель массива в определенное положение? PHP/XML (PHP/XML)


Я пытаюсь создать небольшой сайт, используя XML вместо базы данных.

Я хотел бы создать кнопку next и prev, которая будет работать относительно отображаемого мной контента.

Я нашел функции php next() и prev(), а также current(), но я не знаю, как установить указатель в определенное положение, чтобы иметь возможность перемещаться относительно текущей страницы.

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

Например, если я отображаю содержимое страницы2, как я могу сообщить php, что я нахожусь в $list[1], чтобы далее (список$) отображается страница 3?

Заранее благодарю

Author: chris, 2009-04-28

8 answers

Если ваш массив всегда последовательно индексируется (например, "страница 1" всегда имеет индекс "0"), это довольно просто:

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

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

Лично я не полагаюсь на автоматическое индексирование, потому что всегда есть вероятность, что автоматический индекс может измениться. Вам следует рассмотреть возможность явного определения ключей:

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

РЕДАКТИРОВАТЬ: Если вы хотите проверить значения массива (вместо ключей), используйте current():

while (current($List) !== $CurrentPage) next($List);
 34
Author: matpie, 2009-04-28 07:17:21

Используя приведенные ниже функции, вы можете получить следующие и предыдущие значения массива. Если текущее значение недопустимо или оно является последним ( первый - для предыдущих) значение в массиве, затем:

  • функция getnextval(...) возвращает первое значение элемента
  • функция getprevval(...) возвращает последнее значение элемента

Функции являются циклическими.

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
Author: Andrei, 2010-11-09 12:39:24

Внутренний указатель на массив в основном используется для циклического перемещения по массиву в рамках одного PHP-скрипта. Я бы не рекомендовал использовать его для перемещения со страницы на страницу.

Для этого просто следите за номером страницы и размером страницы (количеством элементов на странице). Затем, когда вы загружаете другую страницу, вы можете использовать их, чтобы решить, какие элементы массива отображать. Например:

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

(или что-то подобное)

 2
Author: JW., 2009-04-27 23:11:36

Используя приведенные ниже функции, вы можете получить следующие и предыдущие Ключи массива. Если текущий ключ недействителен или он является последним ( первый - для предыдущих) введите в массив, затем:

  • функция GetNext(...) возвращает 0 (первый элемент ключ)
  • функция getprev(...) возвращает ключ последнего элемента массива

Функции являются циклическими.

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
Author: Andrei, 2010-11-09 12:40:43

Еще один подход без циклов или поиска.

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
Author: tjungcl, 2011-11-28 09:16:34

Я использую этот код для установки внутреннего указателя с ключом массива.

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

После этого вы можете использовать prev() или next().

Обновление следует за уведомлением от @Vaclavsir

 1
Author: EThaizone Jo, 2016-09-26 09:45:41

Попробуйте это

 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);
        }
    }
}

Для массива, подобного этому:

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
Author: Burhan Ibrahimi, 2015-05-20 16:35:42

Вот полный подход @tjunglc с цикличностью:

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);
}

О, и спасибо @tjunglc за это:)

 -1
Author: Blaž Oražem, 2015-02-13 14:07:59