如何使用PHP&;共点火器
我正试图弄清楚如何在我的第一个CI应用程序(也是有史以来唯一的第二个PHP应用程序)中编写语句,但我被卡住了 我有一个连接表,用于保存各自表中的book_id和user_id。我想找出谁读过一本书,并将其回溯出来,但我需要有意义的格式。以下是查询:如何使用PHP&;共点火器,php,mysql,activerecord,codeigniter,Php,Mysql,Activerecord,Codeigniter,我正试图弄清楚如何在我的第一个CI应用程序(也是有史以来唯一的第二个PHP应用程序)中编写语句,但我被卡住了 我有一个连接表,用于保存各自表中的book_id和user_id。我想找出谁读过一本书,并将其回溯出来,但我需要有意义的格式。以下是查询: $readQuery = $this->db->get_where('books_users', array('book_id' => $isbn)); 这是我对一个人的逻辑 // Get my user info $user =
$readQuery = $this->db->get_where('books_users', array('book_id' => $isbn));
这是我对一个人的逻辑
// Get my user info
$user = $this->ion_auth->get_user();
// Tell me who has read it.
$this->db->select('user_id');
$readQuery = $this->db->get_where('books_users', array('book_id' => $isbn));
// If only one person has read it
if ($readQuery->num_rows() == 1) {
$readResult = $readQuery->row();
// And if that person was me...
if ($readResult->user_id == $user->id) {
$message = 'You have read this.';
// If it was someone else...
} else {
$reader = $this->ion_auth->get_user($readResult->user_id);
$message = "$reader->first_name $reader->last_name has read this";
}
// If two people have read it
}
所以如果只有一个人读过我就好了。但是当两个人读过它时,我希望它说“名字一和名字二读过这个。”如果登录的人没有读过它。如果他们是两个人中的一个,应该说“你和两个名字读过这个”
等等,3-5分钟。如果有3-5个人读过,选项将是“说出一个人、说出两个人和说出三个人读过这个”或“你、说出两个人和说出三个人读过这个”
如果是6个或更多,它应该只说出其中两个的名字,即“你,说出两个,还有5个人读过这个。”
我考虑为每个实例执行一个条件,然后将所有用户推送到一个数组中。然后我可以使用in_array()来查看登录用户是否已读取并尝试报告,但我只是在处理逻辑时遇到了一些问题
有没有更简单的方法
先谢谢你,
Marcus我要说的是,对范围使用switch语句。你必须做一些杂技来处理是否包含“你”的问题。下面的代码未经测试,但给出了总体思路
$message = "";
$readers = array();
$me_included = 0; // Counter increment if you're included in the reader list
$this->db->select('user_id');
$readQuery = $this->db->get_where('books_users', array('book_id' => $isbn));
foreach ($readQuery->result() as $row) {
if ($row->user_id == $user->id) {
$message = "You";
$me_included = 1;
} else {
$readers[] = $this->ion_auth->get_user($row->user_id);
}
}
$reader_count = $sizeof($readers) + $me_included;
switch(TRUE)
{
// One reader, not you
case( ($reader_count == 1) && ($me_included == 0) ):
$message .= $readers[0]->first_name . " " . $readers[0]->last_name . " has read this.";
break;
// Only you
case( ($reader_count == 1) && ($me_included == 1) ):
$message .= " have read this.";
break;
// Two readers
case( ($reader_count == 2) ):
for ($i = 0; $i <= sizeof($readers); $i++) {
if ($i == sizeof($readers)) {
$message .= " and ";
}
$message .= $readers[i]->first_name . " " . $readers[i]->last_name;
}
$message .= " have read this.";
break;
case( ($reader_count > 3) && ($reader_count < 6) ):
if ($me_included) {
$message .= ", ";
}
for ($i = 0; $i <= sizeof($readers); $i++) {
if ($i == sizeof($readers)) {
$message .= " and ";
}
$message .= $readers[i]->first_name . " " . $readers[i]->last_name;
if ($i != sizeof($readers)) {
$message .= ", ";
} else {
$message .= " have read this.";
}
}
break;
case( ($reader_count > 6) ):
if ($me_included) {
$message .= ", " . $readers[0]->first_name . " " . $readers[0]->last_name . " and " . ($reader_count - 2) . " others have read this.";
} else {
for ($i = 0; $i <= 1; $i++) {
$message .= $readers[0]->first_name . " " . $readers[0]->last_name . ", " . $readers[1]->first_name . " " . $readers[1]->last_name . " and " . ($reader_count - 2) . " others have read this.";
}
break;
}
$message=”“;
$readers=array();
$me_include=0;//如果您包含在读卡器列表中,则计数器递增
$this->db->select('user_id');
$readQuery=$this->db->get_-where('books_-users',数组('book_-id'=>$isbn));
foreach($readQuery->result()作为$row){
如果($row->user\u id==$user->id){
$message=“您”;
包括$me_=1;
}否则{
$readers[]=$this->ion\u auth->get\u user($row->user\u id);
}
}
$reader\u count=$sizeof($readers)+$me\u包括在内;
开关(真)
{
//一个读者,不是你
案例($reader_count==1)和($me_include==0)):
$message.=$readers[0]->first\u name.““$readers[0]->last\u name.”已阅读此内容;
打破
//只有你
案例($reader_count==1)和($me_include==1)):
$message.=“您已经读过了。”;
打破
//两个读者
大小写($reader_count==2)):
对于($i=0;$i first\u name.“”。$readers[i]->last\u name;
}
$message.=“您已经读过了。”;
打破
案例($reader_count>3)和($reader_count<6)):
如果(包括我){
$message.=“,”;
}
对于($i=0;$i first\u name.“”。$readers[i]->last\u name;
如果($i!=sizeof($readers)){
$message.=“,”;
}否则{
$message.=“您已经读过了。”;
}
}
打破
案例($reader_count>6)):
如果(包括我){
$message.=“,”$readers[0]->first_name。“$readers[0]->last_name.”和“$reader_count-2.”其他人已经阅读了此内容。“”;
}否则{
对于($i=0;$i first_name.“$readers[0]->last_name.”、“$readers[1]->first_name.”、“$readers[1]->last_name.”、“$readers[1]->last_name.”和“$reader_count-2.”其他人都读过这篇文章。”;
}
打破
}
$users=array();
while($row)
{
如果(当前用户)
{
数组\u unshift($users,'You')
}
其他的
{
$users[]=行[名称]
}
}
$count=$max=count($users);
如果($max>=6)
{
$max=2;
}
$str='';
对于($i=0;$i=6)
{
$str.='和'$count-2.'其他'
}
这应该会对你有所帮助。这几乎是伪代码,但逻辑是用来实现你想要的(我相信)。如果你只是显示一些用户,你显然不想获取所有的行,但这很容易实现。实际上我们可以在一些地方对此进行优化。
1) 在初始查询中,与用户表进行联接,这样我们就不必仅为每个名称再次查询多次:
$readers = $this->db->select('id', 'first_name', 'last_name')->from('books_users')->join('users', 'books_users.id =users.id', 'left')->where('book_id' => $isbn);
2) 此外,通过执行单独的查询,我们可以避免迭代整个(可能较大)结果集以查看您是否读取它:
$you_read = $this->db->get_where('books_users', array('book_id' => $isbn, 'user_id' => $user->id));
为了完整起见,这里是我使用的最后一段代码。希望它对某些人有用
// Find out who has read this book
// Get the users
$current_user = $this->ion_auth->get_user();
$users = $this->ion_auth->get_users();
// Get the readers
$this->db->select('user_id');
$query = $this->db->get_where('books_users', array('book_id' => $isbn));
// If there were results
$readers = array();
if ($query->num_rows() > 0) {
foreach ($users as $user) {
if ($current_user->id == $user->id) {
array_unshift($readers, 'You');
} else {
$readers[] = $user->first_name . ' ' . $user->last_name;
}
$count = $max = count($readers);
if ($max >= 6) {
$max = 2;
}
$message = '';
for ($i = 0; $i < $max; $i++) {
$message .= ($message == '' ? '' : ($i == ($count - 1) && ($count < 6) ? ' and ' : ', ')) . $readers[$i];
}
if ($count >= 6) {
$message .= ' and ' . ($count - 2) . ' others';
}
$message .= ($count == 1 && !$current_user->id ? ' has ' : ' have ') . 'read this.';
}
} else {
$message = '<a href="' . base_url() . 'books/' . $bookResult->filename . '">Be the first to read this.</a>';
}
//找出谁读过这本书
//获取用户
$current_user=$this->ion_auth->get_user();
$users=$this->ion\u auth->get\u users();
//吸引读者
$this->db->select('user_id');
$query=$this->db->get_-where('books_-users',数组('book_-id'=>$isbn));
//如果有结果
$readers=array();
如果($query->num\u rows()>0){
foreach($users作为$user){
如果($current_user->id==$user->id){
数组_unshift($readers,'You');
}否则{
$readers[]=$user->first\u name.'.$user->last\u name;
}
$count=$max=count($readers);
如果($max>=6){
$max=2;
}
$message='';
对于($i=0;$i<$max;$i++){
$message.=($message=''?'':($i==($count-1)和($count<6)?和“:”)。$readers[$i];
}
如果($count>=6){
$message.='和'。($count-2)。'其他';
}
$message.=($count==1&&!$current_user->id?'has':'have')。'readthis';
}
}否则{
$message='';
}
我更喜欢这个设置-它看起来更干净-但我无法在我的场景中实现它。我的大部分困惑来自这一行:$str.=($str=''?:($I==$count-1&&&$count<6''和':',')。$users[$I];有什么建议吗?我对三元语句不太在行,也不明白我在第一个语句的引号里放了什么。三元语句只是为了连接-所以如果str为空,不要追加任何内容,否则追加结果(如果我们是str的结尾,并且我们的值小于6,则追加和其他)
// Find out who has read this book
// Get the users
$current_user = $this->ion_auth->get_user();
$users = $this->ion_auth->get_users();
// Get the readers
$this->db->select('user_id');
$query = $this->db->get_where('books_users', array('book_id' => $isbn));
// If there were results
$readers = array();
if ($query->num_rows() > 0) {
foreach ($users as $user) {
if ($current_user->id == $user->id) {
array_unshift($readers, 'You');
} else {
$readers[] = $user->first_name . ' ' . $user->last_name;
}
$count = $max = count($readers);
if ($max >= 6) {
$max = 2;
}
$message = '';
for ($i = 0; $i < $max; $i++) {
$message .= ($message == '' ? '' : ($i == ($count - 1) && ($count < 6) ? ' and ' : ', ')) . $readers[$i];
}
if ($count >= 6) {
$message .= ' and ' . ($count - 2) . ' others';
}
$message .= ($count == 1 && !$current_user->id ? ' has ' : ' have ') . 'read this.';
}
} else {
$message = '<a href="' . base_url() . 'books/' . $bookResult->filename . '">Be the first to read this.</a>';
}