PHP - 如何从数组中获取倒数第二个元素的前一个元素?

66

在PHP5中,如何获取数组中倒数第二个元素的前一个元素?

6个回答

145

即使在这个数组上也可以运行:

$array[0] = "hello";
$array[5] = "how";
$array[9] = "are";

end($array);
echo prev($array); // will print "how"

使用 count() 方法的其他解决方案假设你的数组索引按顺序排列;通过使用 end 和 prev 移动数组指针,您可以获取实际值。尝试在上面的数组上使用 count() 方法会失败。


5
太棒了!我尝试过使用标记为勾选的解决方案,但无法将其与我的数组配合使用(任何可能计数从1到20)。你的解决方案像魔法一样奏效。谢谢。 - InanisAtheos

89
$array[count($array)-2]

这应该是一个数字索引数组(从零开始)。为了使其起作用,您至少应该有两个元素。 (显然)


3
Erik的回答更加正确,不仅考虑了他提到的非顺序键的情况,而且也适用于关联数组(键为字符串的数组)。 - Wally Lawless
1
这个问题似乎暗示了主题是一个线性数组。当数组只包含一个元素且设置了error_reporting(E_ALL)时,我的解决方案会出现Notice: Undefined offset: -1 in /test.php on line 3的错误。Erik的解决方案则会默默失败,这是不好的。 - Notinlist

23

array_slice函数接受一个负数偏移作为第二个参数。这将得到一个包含倒数第二个元素的单项数组:

$arr = array(1,2,3,4,5,6);
array_slice($arr, -2, 1);
如果您只想要单个值,您有几个选项。如果您不介意使用中间变量,则可以使用 [0] 获取第一个值,或调用 array_pop 或 array_shift,它们都需要通过引用传递变量,否则在严格模式下会出现警告。
或者,您可以使用 array_sum 或 array_product,这有点 hacky,但对于单个项目数组而言效果很好。

获取数组中变量点的一个不错的灵活解决方案。implode('',array_slice($arr, -2, 1)) 可以在一行代码中实现。 - Praesagus

7

一种既适用于关联数组又适用于数字数组的方法是使用array_pop()从数组末尾弹出元素。

$last = array_pop($array);
$second_last = array_pop($array);

// put back the last
array_push($array, $last);

7
所有的数组都有一个“内部数组指针”,它指向当前的数组元素。PHP有几个函数可以让您浏览数组并查看当前元素的键和值。
  • end() - 将数组的内部指针设置为最后一个元素
  • reset() - 将数组的内部指针设置为第一个元素
  • prev() - 倒回数组的内部指针
  • next() - 将数组的内部指针向前移动一位
  • current() - 返回数组中当前元素
  • key() - 从数组中获取一个键
  • each() - 返回数组中当前键和值对,并将数组光标向前移动
这些函数适用于空数组、顺序数组和关联数组,并且由于在示例中未指定数组,我假设这些函数适用于任何数组。
$array = array(
    'before_last' => false,
    'last' => false,
);

end($array); /* 
- set pointer to last element -> $array['last']
- return new current element value if it exists, -> false
- else return FALSE 
*/

prev($array); /* 
- set pointer one place before current pointer -> $array['before_last']
- return new current element value if it exists, -> false
- else return FALSE 
*/

if(!is_null(key($array)){ /* 
- return current element key if it exists -> "before_last"
- else return NULL
*/
    $before_last_element_value = current($array); /* 
    - return current element value if it exists, -> false
    - else return FALSE 
    */
}

如您所见,期望的结果(false)和不存在元素的结果相同(FALSE),因此您不能使用返回的元素值来检查元素是否存在,元素键是不同的。

键可以是整数字符串。 值可以是任何类型来源

key() 返回当前键的值,如果元素存在,则返回NULL。有效的键永远不会为NULL,因此如果返回null,则可以确定该元素不存在。

4
// Indexed based array
$test = array('a','b','c','d','e');
$count = count($test);
print $test[$count-2];

// Associative Array
$months = array(
         'jan'=>'January', 
         'feb' => 'february', 
         'mar' => 'March', 
         'apr' => 'April'
    );

$keys = array_keys($months);
$count = count($keys);
print $keys[$count-2];

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接