• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • 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:你会无法区分包含booleanFALSE单元的数组开头。要正确遍历可能含有空单元或者单元值为 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';
      }
    ?>
    

    上篇:pos()

    下篇:range()