prev

(PHP 4, PHP 5, PHP 7, PHP 8)

prev倒退内部数组指针

描述

prev(array|object &$array): mixed

倒退内部数组指针。

prev() 的行为与 next() 相同,只是它倒退内部数组指针一个位置而不是前进。

参数

array

输入数组。

返回值

返回内部数组指针指向的之前位置处的数组值,如果不再有元素,则返回 false

警告

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

变更日志

版本 描述
8.1.0 object 调用此函数已弃用。可以使用 get_mangled_object_vars()object 转换为 array,或者使用实现 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';
?>

注释

注意: 数组的开头与 bool false 元素无法区分。要区分,请检查 key()prev() 元素是否不是 null

参见

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

添加备注

用户贡献的注释 4 个注释

0
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, true);
if(
$result) {
// 找到匹配项
echo "与 #" . $color . " 最接近的颜色是 #" . base_convert(key($result),10,16) . ",该颜色被称为 '" . $result[key($result)] . "'";
} else {
// 未找到匹配项
echo "没有找到与 #" . $color 的匹配项;
}
}
?>
-1
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);
}

?>
-2
Mikhail
4 年前
一个函数,用于获取数组中在你键之前的值,如果不存在或键在数组中未设置,则返回 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;
}
-11
MicroVB INC
10 年前
对先前函数的一些更正。
- 现在正确地计算 prev() 和 next() 之间的距离,返回“更接近”的那个。
- 当 exact 为 false 且存在具有搜索键的项目时,现在将返回该条目,而不是下一个/上一个最接近的条目。
- 在数组的末尾,有时在使用 next() 或 prev() 超过时,会导致结果消失。这已得到修正。
- 在结果中添加了一个字段,说明匹配项是“精确”的 ('exact'=>true) 还是最接近的 ('exact'=>false)

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

$arr_begin = false;
$arr_end = false;

$exact_match = false;


if(
$exact && isset($array[$value])) {
// 如果找到完全匹配,并且正在寻找精确值(不是最接近的值),则返回结果。
$return = Array($value=>$array[$value]);
$exact_match = true;
} elseif (!
$exact && isset($array[$value])) {
// 如果找到完全匹配,并且正在寻找最接近的值,则返回结果。
$return = Array($value=>$array[$value]);
$exact_match = true;
} else {

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

// 对数组进行排序,以便注入的记录位于相对数值附近
ksort($array); // 按键对数组进行排序

// 设置起始和结束键
$arr_begin = key($array);
end($array);
$arr_end = key($array);
reset($array);

// 循环遍历数组,直到找到匹配项,然后将 $prev 和 $next 设置为相应的键(如果存在)
while ( !is_null($key = key($array)) ) {
$val = current($array);
if(
$key == $value) {
if(
$value <> $arr_begin) {
prev($array); // 获取前一个条目
$prev = key($array);
}

next($array); // 跳过当前条目,因为这是我们正在寻找最接近的条目

if($value <> $arr_end) {
next($array); // 获取下一个条目
$next = key($array);
}
break;
}
next($array);
}

if(
$prev && $next) {
if((
$value - $prev) < ($next - $value)) {
// 前一个更接近
$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]);
}
}
}

// 返回生成的数组。如果没有任何匹配最接近的条件,或者如果指定了精确值并且键不存在,则 $return 为 false。
if($return) {
return
$return+Array('exact'=>$exact_match);
} else {
return
false;
}
}
?>

澄清一下,此函数将返回一个包含结果的 $key=>$value 对和 'exact'=>(bool) 是否匹配的数组。

要访问 $key=>$value 对,可以按以下方式进行:
<?php

$result
= nearest( ... ); // 只是为了澄清后面代码的位置。

if($result) {
// 输出键
echo key($result);

// 输出值
echo $result( key($result) );

// 输出是否完全匹配
if($result['exact']) {
echo
'这是完全匹配';
} else {
echo
'此结果是使用模糊逻辑找到的';
}

} else {

echo
'未找到结果';

}

?>
To Top