如何将数组内部指针设置到特定位置? PHP/XML

Posted

技术标签:

【中文标题】如何将数组内部指针设置到特定位置? PHP/XML【英文标题】:How to set an Arrays internal pointer to a specific position? PHP/XML 【发布时间】:2010-10-22 04:34:55 【问题描述】:

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

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

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

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

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

提前致谢

【问题讨论】:

这有点晚了,但它可能对某人有所帮助。您可以使用array_slice 从特定位置获取数组的确切键/值。 【参考方案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】:

内部数组指针主要用于循环一个 PHP 脚本中的数组。我不建议使用它在页面之间移动。

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

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

(或类似的东西)

【讨论】:

【参考方案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】:

使用下面的函数,您可以获得数组的下一个上一个 。 如果当前 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 而不是数组的第一个索引(循环)。【参考方案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】:

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

【讨论】:

【参考方案8】:

试试这个

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

【讨论】:

以上是关于如何将数组内部指针设置到特定位置? PHP/XML的主要内容,如果未能解决你的问题,请参考以下文章

如何将元素插入到特定位置的数组中?

将指向向量向量的指针移动到特定位置

因为在将指针添加到接口数组后,我无法恢复指针的值

end — 将数组的内部指针指向最后一个单元

end — 将数组的内部指针指向最后一个单元

带有内部数组的Angular2 MatTable数据