Search code examples
phploopsconditional-formattingcounting

Iterate over query result set and display if logged-in user is found and how many other users are found


I'm trying to figure out how to write a statement in my first CI app (and only second PHP app ever) and I'm stuck.

I have a junction table that holds book_id and user_id from their respective tables. I want to find out who has read a book and echo that back out, but I need the formatting to make sense. Here is the query:

$readQuery = $this->db->get_where('books_users', array('book_id' => $isbn));

And here's my logic for one person

// 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
}

So I'm good if only one person has read it. But when two people have read it, I want it to say "Name One and Name Two have read this." if the logged in person hasn't read it. If they're one of the two people, it should say "You and Name Two have read this".

And so on for 3-5. If 3-5 people have read it, the options would be "Name One, Name Two, and Name Three have read this" or "You, Name Two, and Name Three have read this." up to five people

And if it's 6 or more, it should just say the names of two of them, IE "You, Name Two, and 5 other people have read this."

I considered doing a conditional for each instance and then pushing all of the users to an array. Then I could use in_array() to see if the logged-in user has read it and try to report back, but I'm just having some trouble working up the logic.

Is there an easier way?


Solution

  • $users = array();
    while($row)
    {
      if(currentuser)
      {
        array_unshift($users,'You')
      }
      else
      {
        $users[] = row[name]
      }
    }
    
    $count = $max = count($users);
    if($max >= 6)
    {
      $max = 2;
    }
    
    $str = '';
    for($i=0;$i<$max;$i++)
    {
      $str .= ($str == '' ? '' : ($i == $count-1 && $count < 6 ? ' And ' : ', ') ) . $users[$i];
    }
    
    if($count >= 6)
    {
      $str .= ' and '.$count-2.' others'
    }
    

    This should help you along. It's pretty much pseudo-code but the logic is there to achieve what you want (I believe). You'd obviously want to not fetch all the rows if you are just showing a number of users but that can easily be accomplished.