现有二维数组如下:
$arr = array (
'0' => array ( 'name' => 'n1','value' => '10' ),
'1' => array ( 'name' => 'n2','value' => '20' ),
'2' => array ( 'name' => 'n3','value' => '30' ),
'3' => array ( 'name' => 'n4','value' => '40' ),
'4' => array ( 'name' => 'n5','value' => '50' )
);需求如下:需轮转输出,就是value值最大的可输出最多次,为整个数组的个数(5次),依次递减,
如:value为50的,需输出5次,value为40的,需输出4次..value为10的,需输出1次,
当每个都按要求输出过时,再重来一遍,也就是当value为10的输出来1次后,value为50的,如果已输出5次,
那么此时 value为50的又可重新输出5次,这样轮转下去,
每一次输出需同时输出3个value:
现 刷新页面为一轮:
每一轮输出结果应该如下:
第1轮:50 40 30
第2轮:50 40 30
第3轮:50 40 30
第4轮:50 40 20 (此时value为30的已输出了3次,到下一个value输出了)
第5轮:50 20 10 (此时value为40的已输出了4次,到下一个value输出了)
第6轮:30 40 20 (此时value为50的已输出了5次,value为20的已输出了2次,value为10的已输出了1次,停止输出最早的value值,最先起来输出)
......
问:这功能如何实现,thanks
$arr = array (
'0' => array ( 'name' => 'n1','value' => '10' ),
'1' => array ( 'name' => 'n2','value' => '20' ),
'2' => array ( 'name' => 'n3','value' => '30' ),
'3' => array ( 'name' => 'n4','value' => '40' ),
'4' => array ( 'name' => 'n5','value' => '50' )
);需求如下:需轮转输出,就是value值最大的可输出最多次,为整个数组的个数(5次),依次递减,
如:value为50的,需输出5次,value为40的,需输出4次..value为10的,需输出1次,
当每个都按要求输出过时,再重来一遍,也就是当value为10的输出来1次后,value为50的,如果已输出5次,
那么此时 value为50的又可重新输出5次,这样轮转下去,
每一次输出需同时输出3个value:
现 刷新页面为一轮:
每一轮输出结果应该如下:
第1轮:50 40 30
第2轮:50 40 30
第3轮:50 40 30
第4轮:50 40 20 (此时value为30的已输出了3次,到下一个value输出了)
第5轮:50 20 10 (此时value为40的已输出了4次,到下一个value输出了)
第6轮:30 40 20 (此时value为50的已输出了5次,value为20的已输出了2次,value为10的已输出了1次,停止输出最早的value值,最先起来输出)
......
问:这功能如何实现,thanks
thanks
$arr = array('50'=>5,'40'=>4...)这个样子,这样就不用处理直接递归了。
参考
$arr = array (
'0' => array ( 'name' => 'n1','value' => '10' ),
'1' => array ( 'name' => 'n2','value' => '20' ),
'2' => array ( 'name' => 'n3','value' => '30' ),
'3' => array ( 'name' => 'n4','value' => '40' ),
'4' => array ( 'name' => 'n5','value' => '50' )
);
foreach( $arr as $v)
{
$t[$v['value']] = substr($v['name'],1);
}
krsort($t);
function show3col( $t )
{
if( !!$t )
{
$i = 0;
foreach( $t as $k=>$v)
{
if( $i < 3 )
{
echo $k." \n ";
$t[$k]--;
if( $t[$k] == 0 )unset( $t[$k] );
$i++;
}
else break;
}
echo "<br/>";
show3col( $t );
}
}
show3col( $t );
----------------------------------------
怎么还有第6轮。。 这个30,40,20都输出足够次数了,30 40 20还要要输出是基于什么算法?
$arr = array (
'0' => array ( 'name' => 'n1','value' => '10' ),
'1' => array ( 'name' => 'n2','value' => '20' ),
'2' => array ( 'name' => 'n3','value' => '30' ),
'3' => array ( 'name' => 'n4','value' => '40' ),
'4' => array ( 'name' => 'n5','value' => '50' )
);需求如下:需轮转输出,就是value值最大的可输出最多次,为整个数组的个数(5次),依次递减,
如:value为50的,需输出5次,value为40的,需输出4次..value为10的,需输出1次,
当每个都按要求输出过时,再重来一遍,也就是当value为10的输出来1次后,value为50的,如果已输出5次,
那么此时 value为50的又可重新输出5次,这样轮转下去,
每一次输出需同时输出3个value:
现 刷新页面为一轮:
每一轮输出结果应该如下:
第1轮:50 40 30
第2轮:50 40 30
第3轮:50 40 30
第4轮:50 40 20 (此时value为30的已输出了3次,到下一个value输出了)
第5轮:50 20 10 (此时value为40的已输出了4次,到下一个value输出了)
第6轮:30 40 20 (此时value为50的已输出了5次,value为20的已输出了2次,value为10的已输出了1次;最早到输出次数value值,最先起来又一轮输出)
---------------------------------------------------
最早到输出次数的为什么不是30 40 50?而是30 40 20?
建一个数组作为排序用的,键名就是序号
unset + array_push/array_merge 应该可以搞定
此时 20与50都是一样的,只要符合 最早到输出次数value值,最先起来又一轮输出 就可,
'0' => array ( 'name' => 'n1','value' => '10', num => 1, cnt =>0 ),
'1' => array ( 'name' => 'n2','value' => '20', num => 2, cnt =>0 ),
'2' => array ( 'name' => 'n3','value' => '30', num => 3, cnt =>0 ),
'3' => array ( 'name' => 'n4','value' => '40', num => 4, cnt =>0 ),
'4' => array ( 'name' => 'n5','value' => '50', num => 5, cnt =>0 )
);function foo(&$ar, $n=3) {
for($i=0; $i<$n; $i++) {
$t[$i] = array_pop($ar);
echo $t[$i]['value'] .' ';
$t[$i]['cnt']++;
}
echo '<br />';
while($i--) {
if($t[$i]['num'] == $t[$i]['cnt']) {
$t[$i]['cnt'] = 0;
array_unshift($ar, $t[$i]);
} else array_push($ar, $t[$i]);
}
}
for($i=0; $i<10; $i++)
foo($arr);
50 40 30
50 40 30
50 40 30
50 40 20
50 20 10
30 40 10
30 40 20
30 40 20
40 50 10
50 20 30
我是需运行一次页面,输出第一组数据,再运行一次,就输出第二组,依次...
并要满足 最早到输出次数value值,最先起来又一轮输出
这是个不断运行页面,就会有输出的结果的,
你没看到函数 foo 是需要显式的多次执行吗?