Как написать это утверждение, используя PHP & CodeIgniter - PullRequest
2 голосов
/ 27 сентября 2010

Я пытаюсь понять, как написать заявление в моем первом приложении CI (и только втором приложении PHP), и я застрял.

У меня есть таблица соединений, которая содержит book_id и user_id из соответствующих таблиц. Я хочу выяснить, кто прочитал книгу и повторить это, но мне нужно, чтобы форматирование имело смысл. Вот запрос:

$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

Ответы [ 4 ]

3 голосов
/ 27 сентября 2010

Я бы сказал, использовать оператор 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;
  }
2 голосов
/ 27 сентября 2010
$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'
}

Это должно помочь вам в этом.Это в значительной степени псевдокод, но есть логика для достижения того, что вы хотите (я верю).Вы, очевидно, хотели бы не извлекать все строки, если вы просто показываете количество пользователей, но это легко сделать.

1 голос
/ 28 сентября 2010

На самом деле есть пара мест, которые мы можем оптимизировать.

1) В начальном запросе выполните JOIN с таблицей user , чтобы нам не приходилось выполнять многократный запрос только для каждого имени:

$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));
0 голосов
/ 29 сентября 2010

Просто для полноты, вот последний код, который я использовал.Надеюсь, это кому-нибудь пригодится.

    // 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>';
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...