prev
(PHP 4, PHP 5, PHP 7, PHP 8)
prev — 将数组的内部指针倒回一位
参数
-
array
-
The input array.
返回值
返回数组内部指针指向的前一个单元的值,或当没有更多单元时返回 false
。
更新日志
版本 | 说明 |
---|---|
8.1.0 | 弃用在 object 上调用此函数。 在 object 优先使用 get_mangled_object_vars() 或者使用 ArrayIterator。 |
范例
示例 #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';
?>
注释
注意: 很难区分是遇到 boolean
false
单元还是遇到了数组的开头。 需要用 key() 检查 prev() 数组, 是否为null
来作区分。

User Contributed Notes 4 notes
MicroVB INC ¶
8 years ago
This function searches for the closest element in an array by key value, and returns the key/value pair, or false if not found.
<?php
function nearest($array, $value, $exact=false) {
// Initialize Variables
$next = false;
$prev = false;
$return = false;
if(!isset($array[$value]) && !$exact) {
// Insert element that doesn't exist so nearest can be found
$array[$value] = '-';
}
if($exact && isset($array[$value])) {
// If exact match found, and searching for exact (not nearest), return result.
$return = Array($value=>$array[$value]);
} else {
// Sort array so injected record is near relative numerics
ksort($array); // Sort array on key
// Loop through array until match is found, then set $prev and $next to the respective keys if exist
while ( !is_null($key = key($array)) ) {
$val = current($array);
if($key == $value) {
prev($array); // Get entry before this one
$prev = key($array);
next($array); // Skip current entry as this was what we were looking for nearest to
next($array); // Get entry after this one
$next = key($array);
break;
}
next($array);
}
if($prev && $next) {
if(($long - $prev) > ($next - $long)) {
// Previous is closer
$return = Array($prev=>$array[$prev]);
} else {
// Next is closer
$return = Array($next=>$array[$next]);
}
} elseif ($prev || $next) {
if($prev) {
// Only Previous exists
$return = Array($prev=>$array[$prev]);
} elseif ($next) {
// Only Next exists
$return = Array($next=>$array[$next]);
}
}
}
// Return resulting Array(). $return is false if nothing matches the closest conditions, or if exact is specified and key does not exist.
return $return;
}
?>
Example usage (to lookup the closest color in an array)
<?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 to search for in Hex
$color = 'C0C0C0';
// Convert Hex to Long to compare with array() keys
$colorlong = base_convert($color,16,10);
// Check for an exact match
$result = nearest($mycolors, $colorlong, true);
if($result) {
echo "An exact match was found for #" . $color . " which is called '" . $result[key($result)] . "'";
} else {
echo "No exact match was found";
}
if(!$result) {
// Check for closest match
$result = nearest($mycolors, $colorlong, true);
if($result) {
// Match found
echo "The closest match for #" . $color . " is #" . base_convert(key($result),10,16) . " which is called '" . $result[key($result)] . "'";
} else {
// No match found
echo "No match was found for #" . $color;
}
}
?>
soapergem at gmail dot com ¶
13 years ago
Here's a slight revision to xmlich02's backwards iteration example. The problem with his/her example is that it will halt if any of the array elements are boolean false, while this version will not.
<?php
end($ar);
while ( !is_null($key = key($ar)) ) {
$val = current($ar);
echo "{$key} => {$val}\n";
prev($ar);
}
?>
Mikhail ¶
2 years ago
Function to get element in array, that goes previous your key or false if it not exeists or key doesn't isset in array.
<?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;
}
MicroVB INC ¶
8 years ago
Some corrections to the previous function.
- When prev() and next() distance is now calculated properly returning the 'closer' one.
- When exact is false, and an item exists with the key searched for, it now returns that entry instead of next/prev closest
- At ends of the array, sometimes when moving past using next() or prev(), it caused results to die. This was corrected.
- Added field to result stating whether the match was 'exact' ('exact'=>true), or nearest ('exact'=>false)
<?php
function nearest($array, $value, $exact=false) {
// Initialize Variables
$next = false;
$prev = false;
$return = false;
$arr_begin = false;
$arr_end = false;
$exact_match = false;
if($exact && isset($array[$value])) {
// If exact match found, and searching for exact (not nearest), return result.
$return = Array($value=>$array[$value]);
$exact_match = true;
} elseif (!$exact && isset($array[$value])) {
// If exact match found, and searching for nearest, return result.
$return = Array($value=>$array[$value]);
$exact_match = true;
} else {
if(!isset($array[$value]) && !$exact) {
// Insert element that doesn't exist so nearest can be found
$array[$value] = '-';
}
// Sort array so injected record is near relative numerics
ksort($array); // Sort array on key
// Set start and end keys
$arr_begin = key($array);
end($array);
$arr_end = key($array);
reset($array);
// Loop through array until match is found, then set $prev and $next to the respective keys if exist
while ( !is_null($key = key($array)) ) {
$val = current($array);
if($key == $value) {
if($value <> $arr_begin) {
prev($array); // Get entry before this one
$prev = key($array);
}
next($array); // Skip current entry as this was what we were looking for nearest to
if($value <> $arr_end) {
next($array); // Get entry after this one
$next = key($array);
}
break;
}
next($array);
}
if($prev && $next) {
if(($value - $prev) < ($next - $value)) {
// Previous is closer
$return = Array($prev=>$array[$prev]);
} else {
// Next is closer
$return = Array($next=>$array[$next]);
}
} elseif ($prev || $next) {
if($prev) {
// Only Previous exists
$return = Array($prev=>$array[$prev]);
} elseif ($next) {
// Only Next exists
$return = Array($next=>$array[$next]);
}
}
}
// Return resulting Array(). $return is false if nothing matches the closest conditions, or if exact is specified and key does not exist.
if($return) {
return $return+Array('exact'=>$exact_match);
} else {
return false;
}
}
?>
Just to clarify, this function will return either an Array() containing the $key=>$value pair of the result and 'exact'=>(bool) whether the match was exact or not.
To access the $key=>$value pair, can be done as follows :
<?php
$result = nearest( ... ); // Just here for clarification of the position for the code that follows.
if($result) {
// Output the Key
echo key($result);
// Output the Value
echo $result( key($result) );
// Output if exact match
if($result['exact']) {
echo 'This was an EXACT match';
} else {
echo 'This result was found with fuzzy logic';
}
} else {
echo 'No result found';
}
?>