(PHP 4, PHP 5, PHP 7, PHP 8)
prev — Rewind the internal array pointer
Rewind the internal array pointer.
prev() behaves just like next() , except it rewinds the internal array pointer one place instead of advancing it.
array
The input array.
Returns the array value in the previous place that's pointed to by
the internal array pointer, or false
if there are no more
elements.
This function may
return Boolean false
, but may also return a non-Boolean value which
evaluates to false
. Please read the section on Booleans for more
information. Use the ===
operator for testing the return value of this
function.
Version | Description |
---|---|
8.1.0 | Calling this function on object s is deprecated. Either convert the object to an array using get_mangled_object_vars() first, or use the methods provided by a class that implements Iterator , such as ArrayIterator , instead. |
7.4.0 | Instances of SPL classes are now treated like empty objects that have no properties instead of calling the Iterator method with the same name as this function. |
Example #1 Example use of prev() and friends
<?php
$transport = array('foot', 'bike', 'car', 'plane');
echo $mode = current($transport), PHP_EOL; // $mode = 'foot';
echo $mode = next($transport), PHP_EOL; // $mode = 'bike';
echo $mode = next($transport), PHP_EOL; // $mode = 'car';
echo $mode = prev($transport), PHP_EOL; // $mode = 'bike';
echo $mode = end($transport), PHP_EOL; // $mode = 'plane';
?>
Note: The beginning of an array is indistinguishable from a bool
false
element. To make the distinction, check that the key() of the prev() element is notnull
.
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;
}