我怎样才能找到不仅仅是数组中的重复项,而是找到与PHP中的范围相匹配的数字?

I need to find not just duplicates in an array, but numbers that are within 1 of each other.

example: $myArr = array(46,78,77,43,86,1,47,14,51,31)

How would I get find those numbers if there no duplicates were found?

Thanks.

This will work - tested:

 $myArr = array(46,78,77,43,86,1,47,14,51,31);




  $i = 1;

  while($i <= 99){

    if(in_array($i, $myArr)){

        // This means it's in the array
        // Let's see if it's +1 of the last #

            if(isset($last_num)){

                $res = ($i + 1);

                if(in_array($res, $myArr)){
                    echo $res . ' is in the array<br>';
                }

            }
    }

    $last_num = $i;

    $i++;
}

Could use something like this.

<?

$haystack = array(31,46,78,77,43,86,1,47,14,51,31);

array_walk($haystack, function($key, $value) use ($haystack) { 
    $needle = array($key - 1, $key, $key + 1);
    $r = array_intersect($haystack, $needle);
    if(count($r) > 1) { unset($r[$value]); print_r(array_values($r)); }
});

?>

Or if you want them returned in an array:

<?

$haystack = array(31,46,78,77,43,86,1,47,14,51,31);

$result = array_filter(array_map(function($key, $value) use ($haystack) { 
    $needle = array($key - 1, $key, $key + 1);
    $r = array_intersect($haystack, $needle);
    if(count($r) > 1) { unset($r[$value]); return array_values($r)['0']; }
}, $haystack));

print_r($result);
?>

A little more verbose, but it may be more efficient since we're only looping through the array when necessary. It will return the keys of the original array where duplicates and values within range are found. (Note: I've expanded the code out a lot more than I normally would just for readability for OP)

/**
* Find the any values within an array that are within
* the specified range from another value.
*
* @param  Array  Array to search in
* @param  uint   Unsigned integer used for comparison
* @return Array  The keys of all found values
**/
function findWithinRange(Array $array, $range) {
  // sort the array values numerically
  // so we don't have to loop through
  // the entire array for each check
  asort($array, SORT_NUMERIC);

  // Keep the keys in case it's an associative array
  $keys = array_keys($array);

  // Get the values without the keys so we can easily loop
  $values = array_values($array);

  $return = array();

  // Loop over each item in the array
  foreach( $values as $k => $v ) {
    $start = $k;
    $min = $v - $range;
    $max = $v + $range;

    // track backwards in the array until we're less than range
    // We could use array_search, but we'd be calling it multiple times
    // This only runs through the array once and dies the moment
    // it is out of the specified range
    while(true) {
      $k--;

      if( !isset($values[$k]) ) {
        break; // don't continue if we run out of keys
      }

      $curVal = $values[$k];

      if( $curVal >= $min ) {
        $return[] = $keys[$k];
      }
      else {
        break; // kill the while loop if we're outside of range
      }
    }

    // reset
    $k = $start;

    // track forward in the array until we're greater than range
    while(true) {
      $k++;

      if( !isset($values[$k]) ) {
        break; // don't continue if we run out of keys
      }

      $curVal = $values[$k];

      if( $curVal <= $max ) {
        $return[] = $keys[$k];
      }
      else {
        break; // kill the while loop if we're outside of range
      }
    }
  }

  // drop duplicate reports
  $return = array_unique($return);

  // return all found keys
  return $return;
}

Example usage:

$myArr = array(46,78,77,43,86,1,47,14,51,31);
$res = findWithinRange($myArr, 1);

var_export($res);
// array(6, 0, 1, 2)