prev()
(PHP 4, PHP 5, PHP 7)
将数组的内部指针倒回一位
说明
prev(array &$array): mixed
将数组的内部指针倒回一位。
prev()和next()的行为类似,只除了它将内部指针倒回一位而不是前移一位。
参数
- $array
The input array.
返回值
返回数组内部指针指向的前一个单元的值,或当没有更多单元时返回FALSE
。
范例
Example #1prev()及相关函数用法示例
<?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'; ?>
注释
Warning此函数可能返回布尔值
FALSE
,但也可能返回等同于FALSE
的非布尔值。请阅读布尔类型章节以获取更多信息。应使用===运算符来测试此函数的返回值。
Note:你会无法区分包含boolean
FALSE
单元的数组开头。要正确遍历可能含有空单元或者单元值为 0 的数组,参见each()函数。
参见
current()
返回数组中的当前单元end()
将数组的内部指针指向最后一个单元next()
将数组中的内部指针向前移动一位reset()
将数组的内部指针指向第一个单元each()
返回数组中当前的键/值对并将数组指针向前移动一步
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; } } ?>
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); } ?>
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; }
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'; } ?>