不确定我的标题是否准确地解释了我要做的事情,但下面是我的用例:
我有一个身份证数据库 1 = n
,我们称之为500条记录。
我想先用php获取周数 $week = date('W')
所以这周是 48
.
然后我想返回3个唯一的id,这将始终返回相同的id的那一周。举个例子。
Week 1 = Id's 1,2,3
Week 2 = Id's 4,5,6
Week 3 = Id's 7,8,9
Week 4 = Id's 10,11,12
Week 5 = Id's 13,14,15
Week 6 = Id's 16,17,18
等等。
我的方法是从第1周开始,指定3个id,然后在第2周将该周乘以2,然后在随后的每一周继续乘以2并相加 $i = 1
每周递增 $i++
每周从起始号码中选择接下来的3个id。我下面的解决方案似乎有效,但感觉有点古怪。
$weeks = array(1,2,3,4,5,6,7);
$output_arr = array();
$ids_arr = array();
$id1 = 1;
$id2 = $id1 + 1;
$id3 = $id1 + 2;
$i = -1;
foreach ($weeks as $week) {
if ($week == 1) {
$ids = array($id1, $id2, $id3);
$ids = implode(', ', $ids);
} else {
$id1 = $week * 2 + $i;
$id2 = $id1 + 1;
$id3 = $id1 + 2;
$ids = array($id1, $id2, $id3);
$ids = implode(', ', $ids);
}
$output_arr[$week] = $ids;
$i++;
}
所以我的最终结果是:
$output_arr = Array ( [1] => 1, 2, 3 [2] => 4, 5, 6 [3] => 7, 8, 9 [4] => 10, 11, 12 [5] => 13, 14, 15 [6] => 16, 17, 18 [7] => 19, 20, 21 )
这正是我想要的,但是有更简单更干净的方法吗?而且, BONUS HELP NEEDED
如果它能处理具有非顺序id的表,那就更好了。在我的情况下,我的身份证必须是连续的,如果我的身份证的前男友有人闯入: 1,2,3,4,6,7,8,10
它会弄乱输出数组。
谢谢你的帮助。
3条答案
按热度按时间zpgglvta1#
如果要从表中提取所有数据,请按id排序并调用
array_chunk($array, 3)
在resultset数组上,通过从周数中减去1来访问所需的3集。如果只需要从表中提取所需的三行,那么可以按id排序,并将限制“offset”设置为(周减1)乘以3,然后将“limit”设置为3。
ef1yzkbh2#
不需要在数组中存储所有周,一个简单的函数可以完成这项工作:
输出:
von4xj4u3#
或者,如果您没有被一点sql魔法吓跑,您可以在查询中编写一个用户定义的变量,这样所有的信息都可以在您的resultset中分组。
sql(sql演示)
输出:
现在,如果您实际上不打算使用数据库表的每一行,那么最佳实践表明您应该只检索要使用的数据。
要访问一组3个id,请使用php确定当前周数,将其除以3,将该数字四舍五入到下一个整数,然后减去1,以便查询中的limit子句使用
0
(一周内)1
)目标ID1
,2
,和3
; 以及1
(一周内)2
)目标ID4
,6
,7
; 等。代码:(sql演示)
p、 我之所以不使用纯sql来执行这个任务,是因为:我可以在limit offset中使用mysql函数吗。