有这样一个字符串,格式如下: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%)请问这个描述的代码怎么写?
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%)请问这个描述的代码怎么写?
$bin2dut = array(
3=>array(),
4=>array(),
5=>array(),
6=>array(),
7=>array(),
8=>array()
);
$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);
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];//输出结果
$save 为 已知dut的集合: $save = array();
foreach ($arr as $key => $value)
{
if ($value == 0)
$save[] = $key+1;
}
print_r($save);
$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;
}
}
?>
<?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 )是什么意思?希望讲解一下。
$save = array();
foreach ($arr as $key => $value)
{
if ($value == 0)
$save[] = $key+1;
}
print_r($save);
你的$save数组是这样的?
$save = array(1,2,3,4),其中各项表示各个dut值?
LZ 的 $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是数据库中的字段。
$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);
我给你的思路是把各个dut做为键值,而其后的bin(1-8) ,ALL,bin百分比(1-8) 作为$array[dut]下的各个分项数组.
没有计算出对应的 bin
$value = explode( '|', $v );
我把单引号改成双引号就行了,但是报错了:
Warning: max() [function.max]: Array must contain at least one element in ....
$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];//输出结果
}另外,请你把问题描述清楚
我们只能根据对你描述的问题的理解给出解决思路
结果是: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=.....一大串内容;
$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);
$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%
))