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) объявлен устаревшим. Объект (object) либо сначала преобразовывают в массив (array) функцией 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';

?>

Примечания

Замечание: Начало массива неотличимо от элемента с логическим (bool) значением false. Чтобы отличить, нужно проверить, что возвращаемый функцией key() ключ предыдущего элемента, как его определяет функция prev(), не равен значению null.

Смотрите также

  • current() - Возвращает текущий элемент массива
  • end() - Устанавливает внутренний указатель массива на последний элемент
  • next() - Сдвигает внутренний указатель массива на одну позицию вперёд
  • reset() - Устанавливает внутренний указатель массива на первый элемент
  • each() - Возвращает текущую пару ключа и значения массива и сдвигает указатель на одну позицию вперёд

add a note add a note

User Contributed Notes 4 notes

up
0
MicroVB INC
10 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;
    } 
}
?>
up
0
soapergem at gmail dot com
15 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);
}

?>
up
-1
Mikhail
5 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;
}
up
-10
MicroVB INC
10 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';

    }

?>
To Top