web-dev-qa-db-ja.com

配列の内部ポインターを特定の位置に設定する方法は? PHP / XML

データベースの代わりにXMLを使用して小さなサイトを構築しようとしています。

表示したコンテンツに関連して機能する、次のprevボタンを作成したいと思います。

Php関数next()とprev()およびcurrent()を見つけましたが、現在のページを基準にナビゲートできるように特定の位置にポインターを設定する方法がわかりません。

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

例えば、ページ2のコンテンツを表示している場合、next($ list)がpage3を表示するように$ list [1]にいるphpにどのように伝えることができますか?

前もって感謝します

37
chris

配列に常に一貫したインデックスが付けられている場合(たとえば、 '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);
35
matpie

以下の関数を使用すると、nextおよびpreviousを取得できます  配列の。現在の場合  無効であるか、 最終 (最初-前の)  配列内で、次に:

  • 関数 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
Andrei

内部配列ポインターは、主に1つのPHPスクリプト内で配列をループするために使用されます。ページからページへの移動に使用することはお勧めしません。

そのためには、ページ番号とページサイズ(ページあたりのアイテム数)を追跡するだけです。次に、別のページを読み込むときに、表示する配列項目を決定するためにそれらを使用できます。例えば:

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

(または同様のもの)

2
JW.

ループや検索のない別のアプローチ。

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
tjungcl

以下の関数を使用すると、nextおよびpreviousを取得できます キー 配列の。現在の場合 キー 無効であるか、 最終 (最初-前の) キー 配列内で、次に:

  • 関数 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
Andrei

このコードを使用して、配列のキーで内部ポインターを設定します。

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

その後、prev()またはnext()を使用できます。

@VaclavSirからのフォロー通知を更新

1
EThaizone Jo

これを試して

 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
Burhan Ibrahimi