Php 数组将内容分发到新数组
我试图将此数组的内容分配到一个新数组中,新数组键必须只包含总共4个计数,其中Php 数组将内容分发到新数组,php,arrays,Php,Arrays,我试图将此数组的内容分配到一个新数组中,新数组键必须只包含总共4个计数,其中hit=0等于1个计数,hit=1等于2个计数 从分配给变量的数据库获取原始数组$ret: Array ( [0] => Array ( [id] => 33, [hits] => 0 ) [1] => Array ( [id] => 32, [hits] => 0 ) [2] =&
hit=0
等于1个计数,hit=1
等于2个计数
从分配给变量的数据库获取原始数组$ret
:
Array
(
[0] => Array (
[id] => 33, [hits] => 0
)
[1] => Array (
[id] => 32, [hits] => 0
)
[2] => Array (
[id] => 31, [hits] => 0
)
[3] => Array (
[id] => 30, [hits] => 0
)
[4] => Array (
[id] => 29, [hits] => 0
)
[5] => Array (
[id] => 28, [hits] => 1
)
[6] => Array (
[id] => 27, [hits] => 0
)
[7] => Array (
[id] => 26, [hits] => 0
)
[8] => Array (
[id] => 25, [hits] => 1
)
[9] => Array (
[id] => 24, [hits] => 0
)
[10] => Array (
[id] => 23, [hits] => 1
)
[11] => Array (
[id] => 22, [hits] => 1
)
[12] => Array (
[id] => 21, [hits] => 0
)
[13] => Array (
[id] => 20, [hits] => 1
)
[14] => Array (
[id] => 19, [hits] => 1
)
[15] => Array (
[id] => 18, [hits] => 0
)
[16] => Array (
[id] => 17, [hits] => 0
)
[17] => Array (
[id] => 16, [hits] => 0
)
[18] => Array (
[id] => 15, [hits] => 0
)
[19] => Array (
[id] => 14, [hits] => 1
)
[20] => Array (
[id] => 10, [hits] => 0
)
[21] => Array (
[id] => 9, [hits] => 1
)
[22] => Array (
[id] => 8, [hits] => 0
)
[23] => Array (
[id] => 7, [hits] => 0
)
[24] => Array (
[id] => 3, [hits] => 1
)
)
我构建了这个代码:
$new_arr = array();
$row = 0;
$ctr = 0;
foreach($ret as $ak1 => $av1) {
if($ctr == 4) {
$row++;
$ctr = 0;
}
else {
}
if($av1['hits'] == 0) {
$ctr++;
$new_arr[$row][] = $av1;
}
else {
$ctr+=2;
$new_arr[$row][] = $av1;
}
}
print_r($new_arr);
前几个键[0][1][2][3]
似乎包含正确的结果,但不是从键[4]
Array
(
[0] => Array
(
[0] => Array (
[id] => 33
[hits] => 0
)
[1] => Array (
[id] => 32
[hits] => 0
)
[2] => Array (
[id] => 31
[hits] => 0
)
[3] => Array (
[id] => 30
[hits] => 0
)
)
[1] => Array
(
[0] => Array (
[id] => 29
[hits] => 0
)
[1] => Array (
[id] => 28
[hits] => 1
)
[2] => Array (
[id] => 27
[hits] => 0
)
)
[2] => Array
(
[0] => Array (
[id] => 26
[hits] => 0
)
[1] => Array (
[id] => 25
[hits] => 1
)
[2] => Array (
[id] => 24
[hits] => 0
)
)
[3] => Array
(
[0] => Array (
[id] => 23
[hits] => 1
)
[1] => Array (
[id] => 22
[hits] => 1
)
)
[4] => Array
(
[0] => Array (
[id] => 21
[hits] => 0
)
[1] => Array (
[id] => 20
[hits] => 1
)
[2] => Array (
[id] => 19
[hits] => 1
)
[3] => Array (
[id] => 18
[hits] => 0
)
[4] => Array (
[id] => 17
[hits] => 0
)
[5] => Array (
[id] => 16
[hits] => 0
)
[6] => Array (
[id] => 15
[hits] => 0
)
[7] => Array (
[id] => 14
[hits] => 1
)
[8] => Array (
[id] => 10
[hits] => 0
)
[9] => Array (
[id] => 9
[hits] => 1
)
[10] => Array (
[id] => 8
[hits] => 0
)
[11] => Array (
[id] => 7
[hits] => 0
)
[12] => Array (
[id] => 3
[hits] => 1
)
)
)
我很困惑。似乎您正在将
$ctr
与数字4进行匹配,只有当$ctr
在比较点正好等于4时,数字4才有效。由于$ctr
每个循环可能增加1个以上,因此可能超过4个
尝试:
相反。我想我理解你的意思,但不是100%,这就是你想要的吗
foreach($ret as $ak1 => $av1) {
if($ctr >= 4){
$row += 1;
$ctr = 0;
}
if($ret[$ak1]['hits']){
$ctr += 2;
}
else{
$ctr += 1;
}
$new_arr[$row][$ret[$ak1]['id']] = $ret[$ak1]['hits'];
}
对我有效您的问题是需要能够跟踪每个未完成集合中的“计数”。这就成功了。更多详细信息请参见代码注释 如果你有任何问题,请在评论中提问,我会根据需要编辑这篇文章 注意:假设点击次数始终为0或1(计数1或2)。如果项目的点击率大于1(计数大于2),则需要修改它才能工作 编辑:更新代码和结果以解决@fishcracker提出的问题
$sets=array();
//因为有可能有多个未完成的集
$not_full=array();
//因为我们需要跟踪每一组的计数,直到它满为止
$set_template=数组(“计数”=>0);
$set=$set\u模板;
$max=4;
foreach($ret作为$item){
$item_count=$item[“hits”]+1;
//如果我们有一个1计数,并且有几组要加满
如果($item_count==1&&!empty($not_full)){
$top\u off=阵列移位($not\u full);
$top_off[]=$item;
未设置($top_off[“count”]);
$sets[]=$top\u off;
继续;
}
//如果我们要溢出,请将此集合推到以后可能会被加满
如果($set[“count”]+$item\u count>$max){
$not_full[]=$set;
$set=$set\u模板;
}
//将项目添加到当前集合
$set[]=$item;
$set[“count”]+=$item\u count;
//这一套已经满了,
如果($set[“count”]==$max){
未设置($set[“count”]);
$sets[]=$set;
$set=$set\u模板;
}
}
//如果我们留下了一个未完成的循环,我们正在积极地工作
如果(计数($set>1)){
未设置($set[“count”]);
$sets[]=$set;
}
//附加任何等待填满的未完成集
foreach($未满为$set){
未设置($set[“count”]);
$sets[]=$set;
}
印刷(套);
结果:
Array
(
[0] => Array
(
[0] => Array
(
[id] => 33
[hits] => 0
)
[1] => Array
(
[id] => 32
[hits] => 0
)
[2] => Array
(
[id] => 31
[hits] => 0
)
[3] => Array
(
[id] => 30
[hits] => 0
)
)
[1] => Array
(
[0] => Array
(
[id] => 29
[hits] => 0
)
[1] => Array
(
[id] => 28
[hits] => 1
)
[2] => Array
(
[id] => 27
[hits] => 0
)
)
[2] => Array
(
[0] => Array
(
[id] => 26
[hits] => 0
)
[1] => Array
(
[id] => 25
[hits] => 1
)
[2] => Array
(
[id] => 24
[hits] => 0
)
)
[3] => Array
(
[0] => Array
(
[id] => 23
[hits] => 1
)
[1] => Array
(
[id] => 22
[hits] => 1
)
)
[4] => Array
(
[0] => Array
(
[id] => 21
[hits] => 0
)
[1] => Array
(
[id] => 20
[hits] => 1
)
[2] => Array
(
[id] => 18
[hits] => 0
)
)
[5] => Array
(
[0] => Array
(
[id] => 19
[hits] => 1
)
[1] => Array
(
[id] => 17
[hits] => 0
)
[2] => Array
(
[id] => 16
[hits] => 0
)
)
[6] => Array
(
[0] => Array
(
[id] => 15
[hits] => 0
)
[1] => Array
(
[id] => 14
[hits] => 1
)
[2] => Array
(
[id] => 10
[hits] => 0
)
)
[7] => Array
(
[0] => Array
(
[id] => 9
[hits] => 1
)
[1] => Array
(
[id] => 8
[hits] => 0
)
[2] => Array
(
[id] => 7
[hits] => 0
)
)
[8] => Array
(
[0] => Array
(
[id] => 3
[hits] => 1
)
)
)
当你在3岁时,加上2,会发生什么?你得到5,如果($ctr==4)则
{
总是错误的。也许你应该先做所有的2,然后再做所有的1。顺便说一句-学会调试。在代码运行时回显变量的值,这样你就可以看到发生了什么。也许,现在我迷路了,我不擅长操纵或移动数组内部。你要么需要允许不同大小的组,要么允许更改g顺序。否则,你的任务听起来很不可能。说到顺序,怎么能至少做到这一点?我的坏,我的意思是你建议改变顺序。你能至少给我一个见解,我怎么能做到这一点吗?是的,你是对的,但是如果我这样做,我可能会超过4个总数。有些会导致5个计数。你在将每个值添加到新数组后需要进行检查,在这种情况下,它应该重置$ctr并将行计数器增加1,然后在$ctr==3时(且仅当)$ctr==3时才将$ctr增加2。多亏了这一点,这几乎是正确的。但是如果您注意到键[4]
共有5个计数。是否有办法移动此值,然后获得下一个适合的值,使其总数仅为4个计数?太好了!让我研究一下,但乍一看这是正确的!太好了。我试图通过代码注释解释所发生的一切,但如果您对此有任何疑问,请告诉我,因为如果你不明白它是如何工作的,我就没有做我的工作;)但是问题是,如果比如说$ret
只有两个键。它不会被添加到数组集上,至少需要4个。很好!如果你或其他人没有先找到它,我明天会更新答案。需要做的就是,在循环之后,在追加之前g剩余,检查count($set)>1,如果未设置[“count”]键并将其附加到$sets,是否可能在点击被视为剩余的情况下,将其插入下一个集合,而不是在底部或最后填充?
Array
(
[0] => Array
(
[0] => Array
(
[id] => 33
[hits] => 0
)
[1] => Array
(
[id] => 32
[hits] => 0
)
[2] => Array
(
[id] => 31
[hits] => 0
)
[3] => Array
(
[id] => 30
[hits] => 0
)
)
[1] => Array
(
[0] => Array
(
[id] => 29
[hits] => 0
)
[1] => Array
(
[id] => 28
[hits] => 1
)
[2] => Array
(
[id] => 27
[hits] => 0
)
)
[2] => Array
(
[0] => Array
(
[id] => 26
[hits] => 0
)
[1] => Array
(
[id] => 25
[hits] => 1
)
[2] => Array
(
[id] => 24
[hits] => 0
)
)
[3] => Array
(
[0] => Array
(
[id] => 23
[hits] => 1
)
[1] => Array
(
[id] => 22
[hits] => 1
)
)
[4] => Array
(
[0] => Array
(
[id] => 21
[hits] => 0
)
[1] => Array
(
[id] => 20
[hits] => 1
)
[2] => Array
(
[id] => 18
[hits] => 0
)
)
[5] => Array
(
[0] => Array
(
[id] => 19
[hits] => 1
)
[1] => Array
(
[id] => 17
[hits] => 0
)
[2] => Array
(
[id] => 16
[hits] => 0
)
)
[6] => Array
(
[0] => Array
(
[id] => 15
[hits] => 0
)
[1] => Array
(
[id] => 14
[hits] => 1
)
[2] => Array
(
[id] => 10
[hits] => 0
)
)
[7] => Array
(
[0] => Array
(
[id] => 9
[hits] => 1
)
[1] => Array
(
[id] => 8
[hits] => 0
)
[2] => Array
(
[id] => 7
[hits] => 0
)
)
[8] => Array
(
[0] => Array
(
[id] => 3
[hits] => 1
)
)
)