php页面中,有二维数组,数组中有一值num,现已知num=7.0 需把小于num并是最大值 的那一列值输出,也就是输出 num=6.0的那个数组,
$arr = array(
 array( 'id' => 5, 'num' => '5.0'),
 array( 'id' => 3, 'num' => '6.0 ),
 array( 'id' => 6, 'num' => '7.0 ),
);
由于数组中记录量特多,不建议用从头循环到尾的思路,
求如何实现,thanks

解决方案 »

  1.   

    数组有排序呀,生成数组出来时,可以按id 或num排序的,
    排序了又怎么处理呢,
      

  2.   

    数组是从表中取出来的,取数据时是可排序的,
    只是记录量大,
    $arr = array(
     array( 'id' => 5, 'num' => '5.0'),
     array( 'id' => 3, 'num' => '6.0 ),
     array( 'id' => 6, 'num' => '7.0 ),
    );这个数组就可手动调整,(就当取数值时,排序好了)现:已知num=7.0 需把小于num并是最大值 的那一列值输出,也就是输出 num=6.0的那个数组,
      

  3.   

    那你直接2分查找num=7.0 知道某行之后就print_r($arr[row-1])
      

  4.   


    <?php
    $arr = array(
     array( 'id' => 5, 'num' => 5.0),
     array( 'id' => 3, 'num' =>6.0 ),
     array( 'id' => 6, 'num' => 7.0 ),
     array( 'id' => 8, 'num' => 8.0 ),
     array( 'id' => 9, 'num' => 23.0 ),
     array( 'id' => 19, 'num' => 66.0 ),
     array( 'id' => 30, 'num' => 77.0 ),
     array( 'id' => 40, 'num' => 100.0 ),
    );
    print_r($arr);
    $start=0;                    //查找的起始位址
    $end=count($arr)-1;    //查找的结束位址
    $z=0; //计录循环次数
    $a=7.0;
    $pos=0;
    while ($statr<=$end){
      $z++;
      $i=floor(($start + $end)/2);
      $j=$arr[$i]['num']; // 中间记录
      if ($a<$j){
         $end=$i-1;
      }
      elseif ($a > $j){
         $start=$i+1;
      }
      else {
         $find=$arr[$i]['num'];
     $pos=$i;
      break;
      }
    }
    echo $find;
    echo "<br>循环了".$z."次";print_r($arr[$i-1]);?>
      

  5.   

    print_r($arr[$i-1]);改成print_r($arr[$pos-1]);
      

  6.   

    TO  funfun5433建议完善下找不到值的情况,退出机制
      

  7.   


    //数组先按照num由小到大排序
    $num=7.0;
    $tem = "";
    for($i=0; $i<count($arr); $i++) {
    if($arr[$i]['num'] < $num ) {
    $tem = $arr[$i];
    }else{
    print_r($tem);
    return;
    }
    }
      

  8.   

    如果是用sql查询的话就好办了
     select id, num from tabname where num < '$num' order by num desc limit 1
      

  9.   

    7楼的,
    如果是下面的数组
    $arr = array(
     array( 'id' => 3, 'num' =>16.0 ),
     array( 'id' => 5, 'num' => 5.0),
     array( 'id' => 6, 'num' => 7.4 ),
     array( 'id' => 8, 'num' => 8.1 ),
     array( 'id' => 9, 'num' => 23.0 ),
     array( 'id' => 19, 'num' => 66.0 ),
     array( 'id' => 30, 'num' => 7.7 ),
     array( 'id' => 40, 'num' => 100.0 ),
    );求 num小于7.7 的最大值,结果得不到,(应该得到 7.4)
      

  10.   

    $num = 7.7;
    $max = 0.0;
    $arr = array(
    array( 'id' => 3, 'num' =>16.0 ),
    array( 'id' => 5, 'num' => 5.0),
    array( 'id' => 6, 'num' => 7.4 ),
    array( 'id' => 8, 'num' => 8.1 ),
    array( 'id' => 9, 'num' => 23.0 ),
    array( 'id' => 19, 'num' => 66.0 ),
    array( 'id' => 30, 'num' => 7.7 ),
    array( 'id' => 40, 'num' => 100.0 ),
    );
    foreach($arr as $v){if($v['num'] < $num && $v['num'] > $max)$a = $v;}print_r($a);