PHP: проблемы при индексации вложенного цикла for

0

Я пытаюсь напечатать трехмерный массив в таблице. Но индексы вроде бы подтянуты. Когда я использую следующий код (psuedo):

...
<<print headers and stuff>>

for ( $i = 0; $i < count( $array ); i++) {
    $itemArray = $array[i];

    for ( $j = 0; $j < count( $itemArray; j++) {
        $innerItem = $itemArray[j];
        echo <<tr start + both indexes in td>>

        foreach ($innerItem as $spec) {
            echo <<td with item>>
        }

        echo <<tr stop>>
    }
}

В этом примере я использую i как индекс для внешнего массива и j как индекс для внутреннего массива (довольно очевидный). Результат, который я получаю от этого, выглядит следующим образом:

| index i | index j | title1 | title2 |
|    0    |    0    |        |        |
|    1    |    0    |        |        |
|    2    |    0    |        |        |
|   ...   |   ...   |        |        |

Пока я ожидал:

| index i | index j | title1 | title2 |
|    0    |    0    |        |        |
|    0    |    1    |        |        |
|    1    |    0    |        |        |
|    1    |    1    |        |        |
|    1    |    2    |        |        |
|    2    |    0    |        |        |
|   ...   |   ...   |        |        |

Полный (полный) код:

echo "<h1>Combat analysis</h1>";
echo '<table cellspacing="0" cellpadding="4" border="1"><tbody>';
echo "<tr><td>#Mon</td><td>#Att</td><td>DungLVL</td><td>CharLVL</td><td>Health</td><td>Weapon</td><td>No. potions</td></tr>";
for ($battleIndex  = 0; $battleIndex < count($this->combatLog); $battleIndex++) {
    $battle = $this->combatLog[$battleIndex];
    for ($attackIndex = 0; $attackIndex < sizeof($battle); $attackIndex++) {
        $attack = $battle[$attackIndex];
        echo "<tr><td>" . $battleIndex . "</td><td>" . $attackIndex . "</td>";
        foreach ($attack as $stat) {
            echo "<td>" . $stat . "</td>";
        }
        echo "</tr>";
    }
}
echo "</tbody></table>";

Что происходит не так?

  • 4
    Это просто означает, что все ваши битвы имеют размер 1. Скорее всего, ошибка заключается в том, как вы их заполняете, а не в этом коде.
Теги:
for-loop
indexing

1 ответ

1
Лучший ответ

Протестировал ваш код и работает как ожидалось. Вы должны сделать echo '<pre>'.print_r($this->combatLog).'</pre>'; и отлаживать содержимое массива.

Также я бы порекомендовал вам следующее:

1) Вы можете использовать foreach вместо for, например: foreach ($this->combatLog as $battleIndex => $battle)

2) Если вы не уверены, что массив содержит значения, вы должны сначала выполнить: if (is_array($this->combatLog) && count($this->combatLog) > 0)

3) Для простоты и обслуживания кода я бы сначала зациклил многомерный массив и превратил его в одно измерение под названием $ атак, содержащих массив на каждую атаку, индексированную ключами, которые вы можете распознать, ej:

$attacks=array();
$attacks[]=array(
'Mon'=>$battleIndex,
'Att'=>$attackIndex,
'DungLVL'=>isset($stat[0])?$stat[0]:null,
'CharLVL'=>isset($stat[1])?$stat[1]:null,
'Health'=>isset($stat[2])?$stat[2]:null,
'Weapon'=>isset($stat[3])?$stat[3]:null,
'Potions'=>isset($stat[4])?$stat[4]:null,
);

Затем вы можете определить некоторые столбцы, например:

$columns=array(
    'Mon',
    'Att',
    'DungLVL',
    'CharLVL',
    'Health',
    'Weapon',
    'Potions',
);

Затем напечатайте заголовок таблицы следующим образом:

echo '<tr>';
foreach ($columns as $column) {
  echo '<td>'.$column.'</td>';
}
echo '</tr>';

И напечатайте строки следующим образом:

foreach ($attacks as $attack) {
  echo '<tr>';
  foreach ($columns as $column) {
    echo '<td>'.$attack[$column].'</td>';
  }
  echo '</tr>';
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню