鍍金池/ 問答/PHP/ 怎么簡化這段代碼

怎么簡化這段代碼

$amount = 100; //110,90,200
$arr = [98,100,100,120,150,160,183];

如上:變量$amount跟$arr進(jìn)行對比,如果變量在數(shù)組中,則返回?cái)?shù)組中的下標(biāo)值;
如果變量不在數(shù)組中,先檢測變量是否在哪兩個值(AB)之間,如果在,則返回這AB的下標(biāo);
如果不在兩個值之間,若變量小于數(shù)組的第一個值,則返回下標(biāo)0;
若變量大于數(shù)組的最后的值,則返回?cái)?shù)組長度減一。

即:
$amount = 100;    返回 [1,2];
$amount = 110;    返回 [2,3];
$amount = 90;     返回 [0];
$amount = 200;    返回 [6];

下面是我寫的代碼,求精簡。

$key   = [];    //下標(biāo)值的數(shù)組
$count = count($arr) - 1;

foreach($arr as $k => $v){
    if($amount == $v){
        $key[] = $k;
    }
}
if(empty($key)){
    foreach($arr as $k => $v){
        if($amount < $arr[0]){
            $key[] = '';
            break;
        }
    }
}
if(empty($key)){
    foreach($arr as $k => $v){
        if($amount > $arr[$count]){
            $key[] = $count;
            break;
        }
    }
}
if(empty($key)){
    foreach($arr as $k => $v){
        if($amount >= $arr[$k] && $amount < $arr[$k + 1]){
            $key[] = $k;
            $key[] = $k + 1;
        }
    }
}
var_dump($key);
回答
編輯回答
舊時光

function test($amount){

        $arr = [98,100,100,120,150,160,183];
        $max = max($arr);
        $min = min($arr);
        if($amount > $max){
            return count($arr)-1;
        }
        if($amount < $min){
            return 0;
        }
        foreach($arr as $key => $val){
            if($amount == $val){
                $tmp[] = $key;

            }
        }
        if(!empty($tmp)){
            return $tmp;
        }
        foreach($arr as $key => $val){
            if($amount < $val){
                continue;
            }else{
                $tmp[] = $key;
            }
        }
        $return[] = max($tmp);
        $return[] = max($tmp)+1;
        return $return;
    }
    var_dump(test(99));
2017年4月25日 21:34
編輯回答
尋仙

與其一個個判斷,不如把所有的結(jié)果都先拿到,再根據(jù)結(jié)果選擇想輸出的內(nèi)容

$amount = 100; //110,90,200
$arr = [98, 100, 100, 120, 150, 160, 183];

$equal = [];
$contain = [];
$result = [($amount > $arr[count($arr) - 1] ? count($arr) - 2 : 0)];

foreach ($arr as $index => $value) {
  if ($amount === $value) {
    $equal[] = $index;
  } else if ($value < $amount) {
    $contain[0] = $index;
  } else if (count($contain) === 1) {
    $contain[] = $index;
  }
}

$result = count($equal) ? $equal : (count($contain) ? $contain : $result);

var_dump($result);
2017年4月29日 17:10
編輯回答
不將就

剛看到這一題,就想到了二分查找法, 但是有個問題是,數(shù)組元素是可以重復(fù)的,還要返回所有重復(fù)的值的index,所以,只好在找到匹配值的時候,再做個while了

<?php
$arr = [100,100,100,100,120,150,160,183,200];

function find($x,$arr){
  $low = 0;
  $len = count($arr);
  $high =$len-1;
  $result = [];
  

  
  while ($low <= $high){
    $middle = (int)round(($high + $low ) / 2);

    if($x == $arr[$middle]){
      //result = [middle]
      while($low<=$high){
        if($arr[$low] === $x){
            array_push($result,$low);
        }
        
        $low++;
        
      }
      
      break;
    } else if ($x>$arr[$middle]){
      $low = $middle+1;
    } else {
      $high = $middle-1;
    }
  }

  
  if(count($result) === 0 ){
    $result =  [$high,$low];

    if($result[0]<=0){
        return [0];
      }
      
      if($result[0] === $len-1 ){
        return [$len-1];
      }
  }
    
  return $result;
}

$d = find(100,$arr);

var_dump($d);

我寫的時候是用javascript 寫的,最大限度的避免使用語言的內(nèi)置函數(shù),加上php和javascript 都屬于c like的語言,所以這段代碼從javascript改成php 基本就是在變量前面加了個$
javascript 在線運(yùn)行可以看下面
http://jsbin.com/lazuwexuji/1...

2018年2月9日 13:25
編輯回答
礙你眼

我這個版本應(yīng)該是最簡化的

<?php
$result = [];
foreach($arr as $index => $value) {
    if ($amount < $value) {
        $result[0] = $index;
    } else if ($amount === $value) {
        $result[0] = $index;
        break;
    } else {
        $result[] = $index;
        break;
    }
}
var_dump($result);
?>
2017年10月8日 21:44
編輯回答
壞脾滊

精簡后的

<?php

$amount = 110; //110,90,200
$arr = [98,100,100,120,150,160,183];
$key   = [];
$arr_length = count($arr);
for ($i=0; $i<$arr_length; $i++) {
    if($amount == $arr[$i] || (empty($key) && $amount > $arr[$i] && $i == $arr_length - 1)){
        $key[]=$i;
    }
    if(empty($key) && $amount < $arr[$i]) {
        $i-1>=0 ? array_push($key, $i-1, $i) : $key[]=$i;
        break;
    }
} 

var_dump($key);

?>
2017年3月8日 07:38
編輯回答
扯機(jī)薄

//在假設(shè)已經(jīng)做過去重和排序的時候:

$arr = [];
$r   = rand(5,10);

for($i=0;$i<$r;$i++){
    $arr[] = rand(1,10) + ($i>1?$arr[$i-1]:0);
}
$m = rand(0,100);

// main function
$l = $c = $r = 0;
foreach( $arr as $k => $v ){
    if($v === $m){
        $c = $k; 
    }else if($v<$m){
        $l = $k;
        $r = $k+1;
    } 
}
$key = ($c||!$l ) ? [$c] : ( $r===count($arr) ? [$l] : [$l,$r] );


// test
var_dump( $arr );
var_dump( $m );
var_dump( $l );
var_dump( $c );
var_dump( $r );
var_dump( $key );

自己拿去跑一下吧

2017年12月15日 19:25
編輯回答
終相守
<?php
function func($amount,$arr)
{
    //若變量小于數(shù)組的第一個值,則返回下標(biāo)0;
    if($arr[0] > $amount)
    {
        return [0];
    }
    
    $in = [];
    $notin = [];
    foreach($arr as $key => $value)
    {
        //如果變量在數(shù)組中,則返回?cái)?shù)組中的下標(biāo)值;
        if($value == $amount)
        {
            $in[] = $key;
        }
        //如果變量不在數(shù)組中,先檢測變量是否在哪兩個值(AB)之間,如果在,則返回這AB的下標(biāo);
        elseif($value > $amount)
        {
            $notin[] = $key - 1;
            $notin[] = $key;
            break;
        }
    }
    
    if(!empty($in))
    {
        return $in;
    }
    elseif(!empty($notin))
    {
        return $notin;
    }
    else
    {
        //若變量大于數(shù)組的最后的值,則返回?cái)?shù)組長度減一。
        return [count($arr) - 1];
    }
}
$arr = [98,100,100,120,150,160,183];

var_dump(func(100,$arr),[1,2]);
var_dump(func(110,$arr),[2,3]);
var_dump(func(90,$arr),[0]);
var_dump(func(200,$arr),[6]);
2018年5月10日 22:46
編輯回答
萢萢糖
function calcIndex($value, $resource = [])
{
    if ($value < min($resource)) {
        return [0];
    } else if ($value > max($resource)) {
        return [count($resource) - 1];
    }
    $result = [];
    foreach ($resource as $index => $item) {
        if ($item == $value) {
            $result[] = $index;
        } else if ($index < count($resource) - 1 && $value > $item && $value < $resource[$index + 1]) {
            $result = [$index, $index + 1];
        }
    }
    return $result;
}
2017年3月15日 19:52