2012-02-23 2 views
0

Я хотел бы использовать цикл for для доступа к 10 объектам того же класса. Причина в том, что я хочу создать таблицу данных, и я не считаю нужным писать вручную всю разметку html для каждой строки (объекта) в таблице.Обратитесь к объектам в цикле в php

Мой код:

<?php 
    for ($i=1;$i<=10;$i++){ 
?> 
     <tr> 
      <td><? echo $i;?></td><td><?php echo $office1->pc;?></td> 
      <td><?php echo $office1->pc*$office1->pcPowerPerUnit;?></td> 

      <td><? echo $office1->printer;?></td> 
      <td><?php echo $office1->printer*$office1->printerPowerPerUnit;?></td> 

      <td><? echo $office1->lights;?></td> 
      <td><?php echo $office1->lights*$office1->lightsPowerPerUnit;?></td> 

      <td><? echo $office1->aircondition;?></td> 
      <td><?php echo $office1->aircondition*$office1->airconPowerPerUnit;?></td> 

      <td><? echo $office1->server;?></td> 
      <td><?php echo $office1->server*$office1->serverPowerPerUnit;?></td> 

     </tr> 
    <?php } ?> 

То, что я думал, что может быть сделано, чтобы изменить ссылки $ office1-> ПК (например) до $ офиса [$ я] -> рс или что-то в этом роде но это, похоже, не работает. Я также искал итерацию объекта в руководстве php, но это не помогло.

Число объектов фиксировано (10), и свойства уже рассчитаны и готовы к эхоподавлению.

+0

Вы должны сказать нам, какие $ Office1 это? это объект или массив? – Churk

+0

Все объекты называются одинаковыми, в основном $ office1, $ office2 и т. Д.? – davethegr8

+0

Да, вы можете сделать '$ office1 [$ i] -> pc', если это массив, содержащий объект. что, вероятно, проблема, заключается в том, что вы бросаете html в свой php. Вам нужно закрыть тег php после цикла 'for' – Bot

ответ

2

Вы можете использовать специальный синтаксис для обозначения ваших переменных. Ты это:

<?php echo ${'office'.$i}->pc;?>

+0

ничего себе! это сработало. Так было так просто ... – sotoz

1

Использование variable variables:

for ($i = 1; $i <= 10; $i++) { 
    // ... 

    $officeVar = 'office' . $i; 

    // Now you can use $officeVar as a variable variable: 
    $$officeVar->pc; 
    // equivalent to: 
    $office1->pc; 
    // when $i == 1 

    // ... 
} 
+0

ну, спасибо. На самом деле переменные переменные очень полезны в тот момент, который я вижу, но я использовал трюк $ {'office'. $ I} -> pc, и он работал нормально. – sotoz

+1

@SotirisGanouris: '$ {'office'. Синтаксис $ i} -> pc' в основном делает то же самое, только без временной переменной. Это все динамическое имя имени. :-) – FtDRbwLXw6

1
foreach(array($office1, $office2, $o3, $o4) as $o) { 
    ?> 
    ... 
     ... <?php echo $o->pc;?> ... 

<?php 
} 

Расширение массива по мере необходимости. Переменные объекта содержат дескриптор, относящийся к объекту, поэтому это дешевая операция, а не копия.

1

Прежде всего хранить выходные значения столбца в массив:

$columns = array($i, $office->pc, $office->pc*$office->pcPowerPerUnit, ...); 

вы можете затем вывести столбцы независимых к значениям в ваших переменных:

echo '<tr><td>', implode('</td><td>', $columns), '</td></tr>'; 

Осталось только то, что вы перебираете все те переменные, которые у вас есть. Взятый массив гораздо лучше, чем при использовании $office1 в $office10:

foreach($offices as $i => $office) 
{ 
    $columns = array($i, $office->pc, $office->pc*$office->pcPowerPerUnit, ...); 
    echo '<tr><td>', implode('</td><td>', $columns), '</td></tr>'; 
} 

Done. Однако, если вы не хотите, чтобы изменить какой-либо причине (например, не меняя слишком много за один раз), вы можете сделать то же:

foreach(range(1, 10) as $i) 
{ 
    $office = ${'office'.$i}; 
    $columns = array($i, $office->pc, $office->pc*$office->pcPowerPerUnit, ...); 
    echo '<tr><td>', implode('</td><td>', $columns), '</td></tr>'; 
} 
Смежные вопросы