Php 数组将内容分发到新数组

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] =&

我试图将此数组的内容分配到一个新数组中,新数组键必须只包含总共4个计数,其中
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
            )

    )

)