【问题标题】:How to set an Arrays internal pointer to a specific position? PHP/XML如何将 Arrays 内部指针设置到特定位置? PHP/XML
【发布时间】:2009-04-27 23:03:50
【问题描述】:

我正在尝试使用 XML 而不是数据库来构建一个小站点。

我想构建一个下一个和上一个按钮,该按钮将与我显示的内容相关。

我找到了 php 函数 next() 和 prev() 以及 current() 但我不知道如何将指针设置到特定位置以便能够相对于当前页面进行导航。

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

例如,如果我显示 page2 的内容,我如何告诉 php 我在 $list[1] 以便 next($list) 显示 page3?

提前致谢

【问题讨论】:

  • 这有点晚了,但它可能对某人有所帮助。您可以使用array_slice 从特定位置获取数组的确切键/值。

标签: php xml arrays


【解决方案1】:

如果您的数组始终被一致地索引(例如,'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',
);

编辑:如果您想测试数组的值(而不是键),请使用current()

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

【讨论】:

  • 不幸的是,没有指针操纵器函数可以传递索引。接下来,当前,重置,结束等,这就是你所拥有的。如果您必须使用 PHP 的内部指针而不是普通的旧数组下标索引,则上述是正确的解决方案。
  • 如何根据数组的值进行匹配,例如 page1 而不是位置 1?
  • 实际上,你会想要使用current()。 in_array 用于查看值是否在数组中。 php.net/current
  • 如果数组不包含密钥,您的代码将在无限循环中结束。您应该检查指针是否未到达末尾:while (key($List) !== $CurrentPage && key($List) !== null) next($List);
【解决方案2】:

使用下面的函数,您可以获得数组的下一个上一个 。 如果当前 value 无效或者它是 last (first - for prev) value 在数组中,然后:

  • 函数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;
}

【讨论】:

  • getNextVal() 中有错误。在第 1 行声明 $next 时,它应该是 $next = reset($array);。否则,对于最后一个索引,您将得到 0 而不是数组的第一个索引(循环)。
【解决方案3】:

使用下面的函数,可以得到数组的nextpreviousKEYs。 如果当前 key 无效或者它是 last (first - for prev) key 在数组中,然后:

  • 函数getNext(...)返回0(第一个元素key
  • 函数getPrev(...)返回最后一个数组元素的key

函数是循环的。

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

【讨论】:

  • 为什么你发布了两个相同的答案?请删除一个。
  • 一个答案是值,另一个是键……确实,它们必须合并。
【解决方案4】:

内部数组指针主要用于循环一个 PHP 脚本中的数组。我不建议将它用于从一个页面移动到另一个页面。

为此,只需跟踪页码和页面大小(每页的项目数)。然后,当您加载另一个页面时,您可以使用它们来决定要显示哪些数组项。例如:

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

(或类似的东西)

【讨论】:

    【解决方案5】:

    另一种没有循环或搜索的方法。

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

    【讨论】:

    • if(!isset($prev)) $prev = -1; if(!isset($next)) $next = -1;在 return 之前添加这两个语句会更准确
    【解决方案6】:

    我使用这个代码来设置内部指针和数组的键。

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

    之后你可以使用 prev() 或 next()。

    更新关注@VaclavSir 的通知

    【讨论】:

    • 使用key 函数可以更好地检测到数组的末尾:if(key($List) === null) end($List); 因为数组中可以有false 值,但不能有null 为一把钥匙。
    【解决方案7】:

    试试这个

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

    【讨论】:

      【解决方案8】:

      这是完整的 @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 :)

      【讨论】:

        猜你喜欢
        • 2010-10-22
        • 2011-06-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-02-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多