Intereting Posts
Лучшая стратегия защиты загружаемых файлов -php / mysql Apache2 server PHP взвешенное случайное число Есть ли недостатки в использовании двойных слэшей в URL-адресах? Запрос скручивания терпит неудачу на SSL? Magento – разница между цитатой и порядком Поиск нескольких таблиц в одном запросе (MySQL / PHP #) Запретить перезагрузку страницы и перенаправление на форму submit ajax / jquery Возможные значения возврата для mysql_affected_rows () PHP Получить URL с параметром Сделайте таймер обратного отсчета кнопки, который будет отключен навсегда после 5 минут даже при обновлении страницы, он должен оставаться отключенным Расширение PECL для Windows эта динамика (столбец & таблица) PHP выбирает запрос безопасным? Как извлечь полный контент из частичного контента rss Зачем использовать замыкание для назначения вместо прямого назначения значения ключу? # 1075 – неправильное определение таблицы; может быть только один автоматический столбец, и он должен быть определен как ключ

Как установить внутренний указатель Arrays на определенную позицию? PHP / XML

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

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

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

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

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

заранее спасибо

Если ваш массив всегда индексируется последовательно (например, «page1» всегда находится в индексе «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', ); 

EDIT: Если вы хотите проверить значения массива (вместо ключей), используйте current() :

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

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

  • функция 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; } 

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

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

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

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

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

  • функция 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; } 

другой aproach без циклов или поиска.

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

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

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

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

Обновление после уведомления от @VaclavSir

Попробуй это

  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 => 

Вот полный подход @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 за это 🙂