2024年PHP开发者大会(日本)

prev

(PHP 4、PHP 5、PHP 7、PHP 8)

prev倒回内部数组指针

描述

prev(数组|对象 &$array): 混合

倒回内部数组指针。

prev() 的行为与 next() 类似,只是它将内部数组指针倒回一位而不是前进。

参数

数组

输入数组。

返回值

返回内部数组指针指向的前面位置的数组值,如果没有任何更多元素则返回 false

警告

此函数可能返回布尔值 false,但也可能返回一个计算结果为 false 的非布尔值。请阅读关于 布尔值 的部分以了解更多信息。使用 === 运算符 来测试此函数的返回值。

变更日志

版本 描述
8.1.0 对象调用此函数已弃用。请先使用 get_mangled_object_vars()对象转换为数组,或者改用实现 Iterator 接口的类的提供的函数,例如 ArrayIterator
7.4.0 SPL 类的实例现在被视为没有属性的空对象,而不是调用与该函数同名的 Iterator 方法。

示例

示例 #1 prev() 及其相关函数的使用示例

<?php
$transport
= array('foot', 'bike', 'car', 'plane');
$mode = current($transport); // $mode = 'foot';
$mode = next($transport); // $mode = 'bike';
$mode = next($transport); // $mode = 'car';
$mode = prev($transport); // $mode = 'bike';
$mode = end($transport); // $mode = 'plane';
?>

注释

注意: 数组的开头与 布尔 false 元素无法区分。为了区分两者,请检查 key() prev() 元素的键值是否不是 null

参见

  • current() - 返回数组中的当前元素
  • end() - 将数组的内部指针设置为其最后一个元素
  • next() - 向前移动数组的内部指针
  • reset() - 将数组的内部指针设置为其第一个元素
  • each() - 返回数组中的当前键值对,并向前移动数组游标

添加注释

用户贡献的注释 3 条注释

MicroVB INC
10 年前
此函数按键值搜索数组中最近的元素,并返回键值对,如果未找到则返回 false。

<?php
function nearest($array, $value, $exact=false) {
// 初始化变量
$next = false;
$prev = false;
$return = false;

if(!isset(
$array[$value]) && !$exact) {
// 插入不存在的元素以便找到最近的值
$array[$value] = '-';
}

if(
$exact && isset($array[$value])) {
// 如果找到精确匹配,并且正在搜索精确值(而非最近值),则返回结果。
$return = Array($value=>$array[$value]);
} else {
// 对数组排序,以便插入的记录靠近相关的数值
ksort($array); // 按键排序数组

// 循环遍历数组直到找到匹配项,然后如果存在则将 $prev 和 $next 设置为各自的键
while ( !is_null($key = key($array)) ) {
$val = current($array);
if(
$key == $value) {
prev($array); // 获取此条目之前的条目
$prev = key($array);
next($array); // 跳过当前条目,因为这是我们正在寻找最近值的条目
next($array); // 获取此条目之后的条目
$next = key($array);
break;
}
next($array);
}

if(
$prev && $next) {
if((
$long - $prev) > ($next - $long)) {
// 前一个更近
$return = Array($prev=>$array[$prev]);
} else {
// 后一个更近
$return = Array($next=>$array[$next]);
}
} elseif (
$prev || $next) {
if(
$prev) {
// 只有前一个存在
$return = Array($prev=>$array[$prev]);
} elseif (
$next) {
// 只有后一个存在
$return = Array($next=>$array[$next]);
}
}
}

// 返回结果数组。如果没有任何内容满足最接近的条件,或者如果指定了 exact 且键不存在,则 $return 为 false。
return $return;
}
?>

示例用法(查找数组中最接近的颜色)
<?php
$mycolors
= Array(
5001046=>'Abbey',
1774596=>'Acadia',
8171681=>'Acapulco',
6970651=>'Acorn',
13238245=>'Aero Blue',
7423635=>'Affair',
8803850=>'Afghan Tan',
13943976=>'Akaroa',
16777215=>'Alabaster',
16116179=>'Albescent White',
10176259=>'Alert Tan',
30371=>'Allports'
);

// 要搜索的十六进制颜色
$color = 'C0C0C0';

// 将十六进制转换为长整型以与数组()键进行比较
$colorlong = base_convert($color,16,10);

// 检查精确匹配
$result = nearest($mycolors, $colorlong, true);
if(
$result) {
echo
"找到与 #" . $color . " 精确匹配的颜色,名为 '" . $result[key($result)] . "'";
} else {
echo
"未找到精确匹配";
}

if(!
$result) {
// 检查最接近的匹配
$result = nearest($mycolors, $colorlong, false);
if(
$result) {
// 找到匹配项
echo "与 #" . $color . " 最接近的匹配颜色为 #" . base_convert(key($result),10,16) . ",名为 '" . $result[key($result)] . "'";
} else {
// 未找到匹配项
echo "未找到与 #" . $color." 匹配的颜色";
}
}
?>
soapergem at gmail dot com
15年前
这是对 xmlich02 反向迭代示例的略微修改。他/她的示例的问题在于,如果任何数组元素为布尔值 false,它将停止,而此版本不会。

<?php

end
($ar);
while ( !
is_null($key = key($ar)) ) {
$val = current($ar);
echo
"{$key} => {$val}\n";
prev($ar);
}

?>
Mikhail
5年前
获取数组中在您的键之前的元素的函数,如果该元素不存在或键未在数组中设置,则返回 false。

<?php

function previousElement(array $array, $currentKey)
{
if (!isset(
$array[$currentKey])) {
return
false;
}
end($array);
do {
$key = array_search(current($array), $array);
$previousElement = prev($array);
}
while (
$key != $currentKey);

return
$previousElement;
}
To Top