Отображать результаты вложенного массива php непрерывно в двухколоночной таблице - PullRequest
0 голосов
/ 16 января 2012

У меня есть вложенный массив, объединяющий три других массива: $ online, $ busy и $ offline, чтобы отображать результаты именно в этом порядке.

$conteudo = array($online, $ocupado, $offline);

Желаемым результатом будет таблица из двухстолбцы для отображения результатов в непрерывном потоке, например:

online1 | online2
online3 | busy1
busy2   | offline1
offline2| offline3
offline4|

Я пробовал множество циклов foreach и пытался изменить html-теги, но самый близкий, который я могу получить к желаемому результату, это:

<table width='100%' cellpadding='5' border="1">
<?php
$i = 1; //contador de colunas
$max_colunas = 2; // numero de colunas
foreach ($conteudo as $row) {
    echo "<tr>";
    foreach ($row as $col) {
        foreach ($col as $cell) {
            if ($i == 1) {
                echo "<td>" . $cell . "</td>";
            } elseif ($i == $max_colunas){
                echo "<td>" . $cell . "</td></tr>";
                $i = 0;
            } else {
                echo "<td>" . $cell . "</td>";
            }
            $i++;
        }
    }   
    echo "</tr>"; 
}   

Этот код выведет следующую таблицу:

 onine1  | online2 |online3
 busy1   | busy2   |
 offline1|offline2 |offline3|offline4

Я не могу понять, почему он полностью игнорирует $max_colunas, похоже, что он печатает все элементы внутримассив в строке.

Если я уберу строки:

 echo "<tr>";
 echo "</tr>";

из начала и конца foreach, он выведет все подряд, как показано ниже:

onine1  | online2 |online3 | busy1 | busy2 |offline1|offline2 |offline3|offline4

Будем очень благодарны за любые предложения получить желаемый формат вывода.


Отредактировано 17/01:

Вот как я получаю массивы из:

//group people
$online = array(); //group online
$ocupado = array(); //group ocupado
$offline = array(); //group offline

//select people to group
$atendentes = mysql_query("SELECT nome FROM atendentes ORDER BY nome") or die(mysql_error());
$atendentedb = array();

//put selected people in array
while ($row = mysql_fetch_assoc($atendentes)) {
    $atendentedb[] = array('nome' => $row["nome"], 'online' => false);
}


//take people online now and check in selected people
$names = modWhosonlineCustom::getOnlineUserNames();

foreach ($names as $name):
    //foreach ($atendentedb as $atendente):
    for($i = 0; $i < count($atendentedb); $i++):
        $att = strtolower($name->username);

        if ($atendentedb[$i]['nome'] == $att):          
            $atendentedb[$i]['online'] = true;
            break;
        endif;

   endfor;
endforeach;

//check each selected people
foreach ($atendentedb as $atendente) :
    //save temporary data
    $online_ = $atendente['online'];
    $nome_   = $atendente['nome'];  

    //if selected people online
    if ($online_) :
        //take status to show
        $status = mysql_query("SELECT status FROM atendentes WHERE nome = '$nome_' LIMIT 1") or die(mysql_error());
        while ($row = mysql_fetch_assoc($status)):
            $statusdb = $row["status"];
        endwhile;

        //verify and save deppending on status
        switch ($statusdb):

            //if online
            case "disponivel":
                $descricao = mysql_query("SELECT hp_online FROM atendentes WHERE nome = '$nome_' LIMIT 1") or die(mysql_error());
                while ($row = mysql_fetch_assoc($descricao)):
                $online[] = array('info'=>$row['hp_online']);
                endwhile;
                break;

        //if busy
            case "ocupado":
                $descricao = mysql_query("SELECT hp_busy FROM atendentes WHERE nome = '$nome_'  LIMIT 1") or die(mysql_error());
                while ($row = mysql_fetch_assoc($descricao)):
                    $ocupado[] = array('info'=>$row['hp_busy']);
                endwhile;
                break;
        endswitch;

    //if offline
    else:
        $descricao = mysql_query("SELECT hp_offline, horario FROM atendentes WHERE nome = '$nome_' LIMIT 1") or die(mysql_error());
        while ($row = mysql_fetch_assoc($descricao)):
           $offline[] = array('info'=>$row['hp_offline'], 'horario'=>$row['horario']);
        endwhile;

    endif;
endforeach;

РЕДАКТИРОВАНИЕ

Итак, следуя инструкциям справки from DaveRandom Я получил этот код, который действительно далек от правильного формата, за исключением «таинственного» поведения с результатами, поступающими из массива $offline, которые отображают все в «блоке» (все ячейки в строке,или все ячейки в столбце), в то время как другие массивы отображаются идеально (??).

   //group people
   $online = $ocupado = $offline = array();

   //select people to group
   $query = "SELECT nome, status, hp_online, hp_busy, hp_offline, horario
      FROM atendentes
      ORDER BY nome";
  $atendentes = mysql_query($query) or die(mysql_error());
  $atendentedb = array();

  // put selected people in array
  while ($row = mysql_fetch_assoc($atendentes)) {
  $atendentedb[strtolower($row['nome'])] = array_merge($row, array('online' => FALSE));
  }

  //take people online now and check in selected people
  $names = modWhosonlineCustom::getOnlineUserNames();
  foreach ($names as $name) {
  $uname = strtolower($name->username);
  if (isset($atendentedb[$uname])) $atendentedb[$uname]['online'] = TRUE;
  }

  //check each selected people
  foreach ($atendentedb as $name => $atendente) {

  //if selected people online
  if ($atendente['online']) {

 //verify and save deppending on status
 switch ($atendente['status']) {

  //if online
  case 'disponivel':
    $atendentedb[$name]['info'] = $online[] = $atendente['hp_online'];
    break;

  //if busy
  case 'ocupado':
    $atendentedb[$name]['info'] = $ocupado[] = $atendente['hp_busy'];
    break;

  }

  //if offline
  } else {

  $atendentedb[$name]['info'] = $offline[] = $atendente['hp_offline'];
$atendentedb[$name]['info'] = $offline[] = $atendente['horario'];

  }

}

  //*******Display Results
  $conteudo = array_merge($online, $ocupado, $offline);
  $max_colunas = 2; // numero de colunas

  // Start the table
  echo '<table width="100%" cellpadding="5" border="1">'."\n";

  // Loop all the objects
  for ($i = 0, $j = 0; isset($conteudo[$i]); $i++) {
  if ($j == 0) {
  // Output the beginning of a row
  echo "  <tr>\n";
  }
  // Always output a data cell
  echo "    <td>$conteudo[$i]</td>\n";
  if (++$j >= $max_colunas) {
  // Output the end of a row and reset the cell counter
  echo "  </tr>\n";
  $j = 0;
  }
  }

  if ($j) {
  // We may end up with an incomplete row at the end, so pad it with empty cells
  // and close the row
  while ($j++ < $max_colunas) {
 echo "    <td></td>\n";
 }
 echo "  </tr>\n";
 }

 // Close the table
 echo "</table>";

Ответы [ 2 ]

0 голосов
/ 17 января 2012

Я думаю, вы должны обновить счетчик внутри foreach ($col as $cell) { }, поэтому он будет считать элементы внутренних массивов, а также перемещать декальтрацию туда <tr>. if (!is_int($i/2)) { print '<tr><td>' }

0 голосов
/ 16 января 2012

Я бы сказал, что первое, что нужно сделать здесь, это «сгладить» массив - наличие нескольких измерений делает это намного сложнее, чем нужно.Поэтому вместо создания $conteudo вот так:

$conteudo = array($online, $ocupado, $offline);

... сделайте это вместо:

$conteudo = array_merge($online, $ocupado, $offline);

Тогда вы можете сделать это:

$max_colunas = 2; // numero de colunas

// Start the table
echo '<table width="100%" cellpadding="5" border="1">'."\n";

// Loop all the objects
for ($i = 0, $j = 0; isset($conteudo[$i]); $i++) {
  if ($j == 0) {
    // Output the beginning of a row
    echo "  <tr>\n";
  }
  // Always output a data cell
  echo "    <td>$conteudo[$i]</td>\n";
  if (++$j >= $max_colunas) {
    // Output the end of a row and reset the cell counter
    echo "  </tr>\n";
    $j = 0;
  }
}

if ($j) {
  // We may end up with an incomplete row at the end, so pad it with empty cells
  // and close the row
  while ($j++ < $max_colunas) {
    echo "    <td></td>\n";
  }
  echo "  </tr>\n";
}

// Close the table
echo "</table>";

Посмотрите, как это работает

РЕДАКТИРОВАТЬ

Попробуйте этот код для создания ваших массивов.Обратите внимание, что структура ваших выходных массивов была изменена в соответствии с моим примером кода выше - если вы используете эти данные где-либо еще в вашем скрипте, вам также потребуется изменить этот код.Я изменил это так, что есть только один запрос к базе данных, который, казалось бы, все, что требуется.Я также изменил его так, чтобы $atendentedb содержал все пользовательские данные, включая клавиши status и info, а все строки содержали клавишу horario.

Из-за того, что вашвходные массивы изначально содержали больше данных, чем те, которые созданы этим кодом, код может нуждаться в дальнейшей модификации - но попробуйте это и посмотрите, как вы попали.

//group people
$online = $ocupado = $offline = array();

//select people to group
$query = "SELECT nome, status, hp_online, hp_busy, hp_offline, horario
          FROM atendentes
          ORDER BY nome";
$atendentes = mysql_query($query) or die(mysql_error());
$atendentedb = array();

// put selected people in array
while ($row = mysql_fetch_assoc($atendentes)) {
  $atendentedb[strtolower($row['nome'])] = array_merge($row, array('online' => FALSE));
}

//take people online now and check in selected people
$names = modWhosonlineCustom::getOnlineUserNames();
foreach ($names as $name) {
  $uname = strtolower($name->username);
  if (isset($atendentedb[$uname])) $atendentedb[$uname]['online'] = TRUE;
}

//check each selected people
foreach ($atendentedb as $name => $atendente) {

  //if selected people online
  if ($atendente['online']) {

    //verify and save deppending on status
    switch ($atendente['status']) {

      //if online
      case 'disponivel':
        $atendentedb[$name]['info'] = $online[] = $atendente['hp_online'];
        break;

      //if busy
      case 'ocupado':
        $atendentedb[$name]['info'] = $ocupado[] = $atendente['hp_busy'];
        break;

    }

  //if offline
  } else {

    $atendentedb[$name]['info'] = $offline[] = $atendente['hp_offline'].' '.$atendente['horario'];

  }

}
...