PHP 5.4.36 Released

prev

(PHP 4, PHP 5)

prevRetrocede o ponteiro interno de um array

Descrição

mixed prev ( array &$array )

Retrocede o ponteiro interno do array.

prev() funciona como next(), exceto que ela retrocede o ponteiro interno do array ao invés de avançá-lo.

Parâmetros

array

O array de entrada.

Valor Retornado

Retorna o valor do array que está na posição anterior à posição apontada pelo ponteiro interno, ou FALSE se não houver mais elementos.

Exemplos

Exemplo #1 Exemplo de uso de prev() e funções relacionadas

<?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';
?>

Notas

Aviso

Esta função pode retornar o booleano FALSE, mas também pode retornar um valor não-booleano que pode ser avaliado como FALSE, como 0 ou "". Leia a seção em Booleanos para maiores informações. Utilize o operador === para testar o valor retornado por esta função.

Nota: Você não conseguirá distinguir o começo de um array de um elemento boolean FALSE. Para corretamente percorrer um array que pode conter elementos FALSE, veja a função each().

Veja Também

  • current() - Retorna o elemento corrente em um array
  • end() - Faz o ponteiro interno de um array apontar para o seu último elemento
  • next() - Avança o ponteiro interno de um array
  • reset() - Faz o ponteiro interno de um array apontar para o seu primeiro elemento
  • each() - Retorna o par chave/valor corrente de um array e avança o seu cursor

add a note add a note

User Contributed Notes 3 notes

up
2
soapergem at gmail dot com
5 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
MicroVB INC
8 months 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
-1
MicroVB INC
8 months 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