有这样一个字符串,格式如下:DUT|bin1|bin2|bin3|bin4|bin5|bin6|bin7|bin8|ALL|bin1%|bin2%|bin3%|bin4%|bin5%|bin6%|bin7%|bin8%,1|0|0|0|1|32|60|3|0|96|0.00%|0.00%|0.00%|1.04%|33.33%|62.5%|3.13%|0.00%,
2|0|0|0|1|47|46|2|0|96|0.00%|0.00%|0.00%|1.04%|48.96%|47.92%|2.08%|0.00%,
3|0|0|0|0|44|47|4|1|96|0.00%|0.00%|0.00%|0.00%|45.83%|48.96%|4.17%|1.04%,
4|0|0|0|1|48|44|3|0|96|0.00%|0.00%|0.00%|1.04%|50%|45.83%|3.13%|0.00%,
.....其中每个DUT对应bin1-bin8这8个bin,bin1%-bin8%分别为它们的百分比。
现在已知dut:
$save 为 已知dut的集合:$save = array();
foreach ($arr as $key => $value)
{
  if ($value == 0)
  $save[] = $key+1;

print_r($save);
求已知dut对应的bin3%到bin8%的最大值。(例中假设得到dut为4,它对应的最大的bin%是bin5%)请问这个描述的代码怎么写?

解决方案 »

  1.   

    如何建立bin和dut两者之间的关系,或者如下:
    $bin2dut = array(
     3=>array(),
     4=>array(),
     5=>array(),
             6=>array(),
             7=>array(),
             8=>array()
            );
      

  2.   

    dut唯一的话,就把dut作key$data = '1|0|0|0|1|32|60|3|0|96|0.00%|0.00%|0.00%|1.04%|33.33%|62.5%|3.13%|0.00%,2|0|0|0|1|47|46|2|0|96|0.00%|0.00%|0.00%|1.04%|48.96%|47.92%|2.08%|0.00%,3|0|0|0|0|44|47|4|1|96|0.00%|0.00%|0.00%|0.00%|45.83%|48.96%|4.17%|1.04%,4|0|0|0|1|48|44|3|0|96|0.00%|0.00%|0.00%|1.04%|50%|45.83%|3.13%|0.00%';
    $dataArray = explode(',',$data);
    foreach($dataArray as $v)
    {
    $t = explode('|',$v);
    $k = $t[0];
    $f[$k] = array();
    $f[$k]['bin'] = array_slice($t,1,8);
    $f[$k]['all'] = array_slice($t,9,1);
    $f[$k]['binpercent'] = array_slice($t,10);
    }$dut = 4;
    $s = 3;
    $e = 8;
    $mp     = maxPercent($f[4]['binpercent'],$s-1,$e-1);
    echo "the max percent is : ".$mp."(bin%".(array_search($mp,$f[4]['binpercent'])+1).")";function maxPercent($array,$s,$e='')
    {
    return max(array_splice($array,$s,$e));
    }
    echo "<pre/>";
    print_r($f);
      

  3.   

    $s = <<< DATA
    DUT|bin1|bin2|bin3|bin4|bin5|bin6|bin7|bin8|ALL|bin1%|bin2%|bin3%|bin4%|bin5%|bin6%|bin7%|bin8%,
    1|0|0|0|1|32|60|3|0|96|0.00%|0.00%|0.00%|1.04%|33.33%|62.5%|3.13%|0.00%,
    2|0|0|0|1|47|46|2|0|96|0.00%|0.00%|0.00%|1.04%|48.96%|47.92%|2.08%|0.00%,
    3|0|0|0|0|44|47|4|1|96|0.00%|0.00%|0.00%|0.00%|45.83%|48.96%|4.17%|1.04%,
    4|0|0|0|1|48|44|3|0|96|0.00%|0.00%|0.00%|1.04%|50%|45.83%|3.13%|0.00%
    DATA;$ar = explode(',', $s);
    foreach($ar as $k=>$v) {
      $ar[$k] = explode('|', trim($v));
    }/*** 求已知dut对应的bin3%到bin8%的最大值。***/
    function finddut($v) {
      global $dut;
      return $v[0] == $dut;
    }function findcell(&$arr, $name) {
      $k = array_search($name, $arr[0]);
    }
    $dut = 4;
    $t = array_filter($ar, 'finddut');//提取指定的dut集
    $b1 = array_search('bin3%', $ar[0]);//计算开始列
    $b2 = array_search('bin8%', $ar[0]);//计算结束列
    $m = array_slice(current($t),$b1,$b2-$b1);//提取指定范围的数据
    arsort($m);//排序echo $ar[0][key($m)+$b1];//输出结果
      

  4.   

    回楼上的,这里$dut为4只是一个例子,如果换成一个数组该怎么处理?
    $save 为 已知dut的集合: $save = array(); 
    foreach ($arr as $key => $value) 

      if ($value == 0) 
      $save[] = $key+1; 

    print_r($save); 
      

  5.   

    <?php
    $arr = 'DUT|bin1|bin2|bin3|bin4|bin5|bin6|bin7|bin8|ALL|bin1%|bin2%|bin3%|bin4%|bin5%|bin6%|bin7%|bin8%,
    1|0|0|0|1|32|60|3|0|96|0.00%|0.00%|0.00%|1.04%|33.33%|62.5%|3.13%|0.00%,
    2|0|0|0|1|47|46|2|0|96|0.00%|0.00%|0.00%|1.04%|48.96%|47.92%|2.08%|0.00%,
    3|0|0|0|0|44|47|4|1|96|0.00%|0.00%|0.00%|0.00%|45.83%|48.96%|4.17%|1.04%,
    4|0|0|0|1|48|44|3|0|96|0.00%|0.00%|0.00%|1.04%|50%|45.83%|3.13%|0.00%';$arr = explode( ',', $arr );foreach( $arr as $k=>$v )
    {
        if( $k != 0 )
    {
        $value = explode( '|', $v );

    $array = array();

    foreach( $value as $key=>$va )
    {
    if( $key > 11 )
    {
        $array[$key] = $va;
    }
    }

    $max = max( $array );

    $key = array_search( $max, $array );

    $maxkey = $key - 9;

    echo $value[$maxkey]."=>".$max; 

    }

    }
    ?>
      

  6.   

    我改了下,还是不可行:
    <?php
    $lines = explode(",",$row_bin);
    foreach( $lines as $k=>$v )
    {
        if( $k != 0 )
        {
            $value = explode( '|', $v );
            
            $array = array();
            
            foreach( $value as $key=>$va )
            {
                if( $key > 11 )
                {
                    $array[$key] = $va;
                }
            }
            
            $max = max( $array );
            
            $key = array_search( $max, $array );
            
            $maxkey = $key - 9;
            
            echo $value[$maxkey]."=>".$max;   
        }   
    }
    ?>
    没有输出,而且if( $key > 11 )是什么意思?希望讲解一下。
      

  7.   

    $dut = 4 是一个例子,应该将一个数组 $save 赋予 $dut 值。$save
    $save = array(); 
    foreach ($arr as $key => $value) 

      if ($value == 0) 
      $save[] = $key+1; 

    print_r($save); 
      

  8.   

    还是不是很明白,首先确保你的dut在每个串中都是唯一的,才可以考虑用我的代码.
    你的$save数组是这样的?
    $save = array(1,2,3,4),其中各项表示各个dut值?
      

  9.   


    LZ 的 $row_bin  格式是什么样的,如果 和我写的不一样,那肯定没有输出的 ..
      

  10.   

    dut是唯一的。这是一个print_r($save)输出的记录:Array ( [0] => 50 [1] => 51 [2] => 128 [3] => 136 [4] => 153 [5] => 156 [6] => 161 [7] => 165 [8] => 221 [9] => 245 ) 像50,51,128,136,153,156,161,165,221,245这样的就是dut的值。
      

  11.   

    $row_bin 就是相当于
    $arr = 'DUT|bin1|bin2|bin3|bin4|bin5|bin6|bin7|bin8|ALL|bin1%|bin2%|bin3%|bin4%|bin5%|bin6%|bin7%|bin8%,
    1|0|0|0|1|32|60|3|0|96|0.00%|0.00%|0.00%|1.04%|33.33%|62.5%|3.13%|0.00%,
    2|0|0|0|1|47|46|2|0|96|0.00%|0.00%|0.00%|1.04%|48.96%|47.92%|2.08%|0.00%,
    3|0|0|0|0|44|47|4|1|96|0.00%|0.00%|0.00%|0.00%|45.83%|48.96%|4.17%|1.04%,
    4|0|0|0|1|48|44|3|0|96|0.00%|0.00%|0.00%|1.04%|50%|45.83%|3.13%|0.00%';因为$row_bin是数据库中的字段。
      

  12.   

    那好办呀,你循环下$save数组,对每个值调用下不就行了..思路给了你,具体用法你可以扩展啊..$data = '1|0|0|0|1|32|60|3|0|96|0.00%|0.00%|0.00%|1.04%|33.33%|62.5%|3.13%|0.00%,2|0|0|0|1|47|46|2|0|96|0.00%|0.00%|0.00%|1.04%|48.96%|47.92%|2.08%|0.00%,3|0|0|0|0|44|47|4|1|96|0.00%|0.00%|0.00%|0.00%|45.83%|48.96%|4.17%|1.04%,4|0|0|0|1|48|44|3|0|96|0.00%|0.00%|0.00%|1.04%|50%|45.83%|3.13%|0.00%';
    $dataArray = explode(',',$data);
    foreach($dataArray as $v)
    {
    $t = explode('|',$v);
    $k = $t[0];
    $f[$k] = array();
    $f[$k]['bin'] = array_slice($t,1,8);
    $f[$k]['all'] = array_slice($t,9,1);
    $f[$k]['binpercent'] = array_slice($t,10);
    }function dut($f,$dut,$s,$e)
    {
    $mp     = maxPercent($f[$dut]['binpercent'],$s-1,$e-1);
    echo "the max percent is : ".$mp."(bin%".(array_search($mp,$f[$dut]['binpercent'])+1).")<br/>";
    }
    function maxPercent($array,$s,$e='')
    {
    return max(array_splice($array,$s,$e));
    }//############################################
    $save = array(1,2,3,4);foreach($save as $v)
    {
    dut($f,$v,3,8);//求各dut项,3-8项中的最大百分比.
    }
    echo "<pre/>";
    print_r($f);
      

  13.   

    重要的是如何把你的数据组织好,组织好了,算法自然有了..
    我给你的思路是把各个dut做为键值,而其后的bin(1-8) ,ALL,bin百分比(1-8) 作为$array[dut]下的各个分项数组.
      

  14.   


    没有计算出对应的 bin
      

  15.   

    回14楼的:
    $value = explode( '|', $v ); 
    我把单引号改成双引号就行了,但是报错了:
    Warning: max() [function.max]: Array must contain at least one element in ....
      

  16.   

    难道就不会变通一下吗?$b1 = array_search('bin3%', $ar[0]);//计算开始列
    $b2 = array_search('bin8%', $ar[0]);//计算结束列foreach($save as $dut) {
      $t = array_filter($ar, 'finddut');//提取指定的dut集
      $m = array_slice(current($t),$b1,$b2-$b1);//提取指定范围的数据
      arsort($m);//排序
      echo $ar[0][key($m)+$b1];//输出结果
    }另外,请你把问题描述清楚
    我们只能根据对你描述的问题的理解给出解决思路
      

  17.   

    bin%和bin是都8个元素,键值0-7,一一对应的,知道bin%就知道bin
      

  18.   

    我的目的是这样的:通过$save这个数组函数保存$dut的值,print_r($save)。
    结果是:Array ( [0] => 8 [1] => 22 [2] => 35 [3] => 44 [4] => 50 [5] => 67 [6] => 77 [7] => 85 [8] => 92 [9] => 106 [10] => 110 [11] => 121 ) 
    也就是说$save数组函数在本例中保存的值为8 22 35 44 50 67 77 85 92 106 110 121然后我要求这些dut值对应的bin的极大值(binMax范围:bin3%-bin8%)。字符串格式:
    DUT|bin1|bin2|bin3|bin4|bin5|bin6|bin7|bin8|ALL|bin1%|bin2%|bin3%|bin4%|bin5%|bin6%|bin7%|bin8%, 1|0|0|0|1|32|60|3|0|96|0.00%|0.00%|0.00%|1.04%|33.33%|62.5%|3.13%|0.00%, 
    2|0|0|0|1|47|46|2|0|96|0.00%|0.00%|0.00%|1.04%|48.96%|47.92%|2.08%|0.00%, 
    3|0|0|0|0|44|47|4|1|96|0.00%|0.00%|0.00%|0.00%|45.83%|48.96%|4.17%|1.04%, 
    4|0|0|0|1|48|44|3|0|96|0.00%|0.00%|0.00%|1.04%|50%|45.83%|3.13%|0.00%, 
    ..... 在数据库中保存为Bin字段。
    所以取的时候为:$row_bin = $Row['Bin'];//代替了$arr=.....一大串内容;
      

  19.   

    $data = '1|0|0|0|1|32|60|3|0|96|0.00%|0.00%|0.00%|1.04%|33.33%|62.5%|3.13%|0.00%,2|0|0|0|1|47|46|2|0|96|0.00%|0.00%|0.00%|1.04%|48.96%|47.92%|2.08%|0.00%,3|0|0|0|0|44|47|4|1|96|0.00%|0.00%|0.00%|0.00%|45.83%|48.96%|4.17%|1.04%,4|0|0|0|1|48|44|3|0|96|0.00%|0.00%|0.00%|1.04%|50%|45.83%|3.13%|0.00%';
    $dataArray = explode(',',$data);
    foreach($dataArray as $v)
    {
    $t = explode('|',$v);
    $k = $t[0];
    $f[$k] = array();
    $f[$k]['bin'] = array_slice($t,1,8);
    $f[$k]['all'] = array_slice($t,9,1);
    $f[$k]['binpercent'] = array_slice($t,10);
    }function dut($f,$dut,$s,$e)
    {
    $mp     = getMax($f[$dut]['binpercent'],$s-1,$e-1);

    echo "the max percent is : ".$mp."(bin%".(array_search($mp,$f[$dut]['binpercent'])+1).")<br/>";
    echo $dut."=> bin".(array_search($mp,$f[$dut]['binpercent'])+1)."<br/>";
    echo "=================<br/>";
    }
    function getMax($array,$s,$e='')
    {
    return max(array_splice($array,$s,$e));
    }
    $dutArray = array(1,2,3,4);foreach($dutArray as $v)
    {
    dut($f,$v,3,8);
    }
    echo "<pre/>";
    print_r($f);
      

  20.   

    还好,我的理解没有错
    $s = <<< DATA
    DUT|bin1|bin2|bin3|bin4|bin5|bin6|bin7|bin8|ALL|bin1%|bin2%|bin3%|bin4%|bin5%|bin6%|bin7%|bin8%,1|0|0|0|1|32|60|3|0|96|0.00%|0.00%|0.00%|1.04%|33.33%|62.5%|3.13%|0.00%,
    2|0|0|0|1|47|46|2|0|96|0.00%|0.00%|0.00%|1.04%|48.96%|47.92%|2.08%|0.00%,
    3|0|0|0|0|44|47|4|1|96|0.00%|0.00%|0.00%|0.00%|45.83%|48.96%|4.17%|1.04%,
    4|0|0|0|1|48|44|3|0|96|0.00%|0.00%|0.00%|1.04%|50%|45.83%|3.13%|0.00%
    DATA;function format($s) {
      $ar = explode(',', $s);
      foreach($ar as $k=>$v) {
        $ar[$k] = explode('|', trim($v));
      }
      return $ar;
    }function find_max(&$ar, $dut, $begin, $end) {
      $t = array_filter($ar, create_function('$v',"return \$v[0]==$dut;"));
      $m = array_slice(current($t), $begin, $end-$begin);
      arsort($m);
      return array(
        'DUT' => $dut,
        'MAX' => current($m),
        'NAME' => $ar[0][key($m)+$begin]
      );
    }$ar = format($s); //格式化数据,因为转换为数组才好处理。但也不要太复杂
    $b1 = array_search('bin3%', $ar[0]);//为通用起见求取最大值的区间是可以改变的
    $b2 = array_search('bin8%', $ar[0]);$save = array(4,3);//这里是模拟数据
    foreach($save as $d) {
      $r[] = find_max($ar,$d,$b1,$b2);
    }
    print_r($r);Array
    (
        [0] => Array
            (
                [DUT] => 4
                [MAX] => 50%
                [NAME] => bin5%
            )    [1] => Array
            (
                [DUT] => 3
                [MAX] => 48.96%
                [NAME] => bin6%
            ))