php Array как выполнить итерацию

#php #arrays

#php #массивы

Вопрос:

Я использую запрос code-igniter, который возвращает приведенный ниже массив с дополнительным вычисляемым [year_totalsales] , добавленным в массив.

 Array ( [0] => Array ( [year] => 2009 [month] => November [month_sales] => 524 [year_totalsales] => 3610 ) [1] => Array ( [year] => 2009 [month] => December [month_sales] => 521 [year_totalsales] => 3610 ) [2] => Array ( [year] => 2010 [month] => January [month_sales] => 609 [year_totalsales] => 3610 ) [3] => Array ( [year] => 2010 [month] => February [month_sales] => 619 [year_totalsales] => 3610 ) [4] => Array ( [year] => 2010 [month] => March [month_sales] => 732 [year_totalsales] => 3610 ) [5] => Array ( [year] => 2010 [month] => April [month_sales] => 605 [year_totalsales] => 3610 ) )
  

Есть ли способ заставить выходной результат выглядеть так:

 year-------------------------

month---------------monthsales
  

Ответ №1:

ну, вы могли бы сделать что-то вроде:

 <?
$myarray = array( 0 => array( 'year' => 2009, 'month' => "November", 'month_sales' => 524, 'year_totalsales' => 3610 ),
1 => array ( 'year' => 2009, 'month' => 'December', 'month_sales' => 521, 'year_totalsales' => 3610 ),
                  2 => array ( 'year' => 2010, 'month' => "January", 'month_sales' => 609, 'year_totalsales' => 3610 ));

$linewidth = 29; // Change to the width you want of course
$sep = "-"; // Change the seperator you want
$lastyear = "";
function pad($output, $length) {
    global $sep;
    $output = (string)$output;
    while (strlen($output) < $length) {
        $output .= $sep;
    }
    return $output;
}
foreach($myarray as $row) {
    if ($row['year'] != $lastyear) {
        echo pad($row['year'], $linewidth), PHP_EOL;
        $lastyear = $row['year'];
    }
    echo pad($row['month'], $linewidth-strlen((string)$row['month_sales'])), $row['month_sales'], PHP_EOL;
}
?>
  

Конечно, вы могли бы добавить свое собственное форматирование или что-то еще, если это вас не устраивает.

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

Выводит:

 2009-------------------------
November------------------524
December------------------521
2010-------------------------
January-------------------609
  

Редактировать вместо этого используется HTML-таблица:

 <?
$myarray = array( 0 => array( 'year' => 2009, 'month' => "November", 'month_sales' => 524, 'year_totalsales' => 3610 ),
1 => array ( 'year' => 2009, 'month' => 'December', 'month_sales' => 521, 'year_totalsales' => 3610 ),
                  2 => array ( 'year' => 2010, 'month' => "January", 'month_sales' => 609, 'year_totalsales' => 3610 ));

$lastyear = "";
echo "<table><tr><th>Month</th><th>Sales</th></tr>", PHP_EOL;
foreach($myarray as $row) {
    if ($row['year'] != $lastyear) {
        echo "<tr><th colspan=2>", $row['year'], "</th></tr>", PHP_EOL;
        $lastyear = $row['year'];
    }
    echo "<tr><td>", $row['month'], "</td><td>", $row['month_sales'], "</td></tr>", PHP_EOL;
}
echo "</table>", PHP_EOL;
?>
  

Это выводит:

 <table><tr><th>Month</th><th>Sales</th></tr>
<tr><th colspan=2>2009</th></tr>
<tr><td>November</td><td>524</td></tr>
<tr><td>December</td><td>521</td></tr>
<tr><th colspan=2>2010</th></tr>
<tr><td>January</td><td>609</td></tr>
</table>
  

Комментарии:

1. Похоже, ваша идея — это то, чего я хочу достичь. Но добавление его в дизайн, похоже, не выполняет то, что должно, а именно: <h3> Year — Total</h3> <div> <table> <tr> </tr> </таблица> </div>

2. Похоже, ваша идея — это то, чего я хочу достичь. Но добавление его в дизайн, похоже, не выполняет то, что должно, а именно: <h3> Год (2009) — Итого</h3> <div> <таблица> <tr> <td>месяц</td> <td>продажи</td> </tr> <tr> <td>месяц</td> <td>продажи</td> </tr> и т. Д………… </ таблица> </div> <h3> год(2010) — Итого</h3> <div> <таблица> <tr> <td>месяц</td> <td>продажи</td> </tr> <tr> <td>месяц</td> <td>продажи</td> </tr> и т.д…………. </ таблица> </div>

3. КОД НИЖЕ: <?php if( !empty($data)){ $lastyear = «»; foreach($data as $row) { if ($row[‘year’] != $lastyear) { <h3><a href=»#»><?=$row[‘year’]?> — Итого <?=$row[‘year_totalsales’]?></a></h3> <?php $lastyear = $row[ ‘year’]; } ?> <div> <ширина таблицы=»100%»> <thead> <tr> <th> Месяц</th> <th width=»10%»> Сумма</th> </tr> </thead> <tbody> <tr> <td><?=$row[‘месяц’]?></td> <td><?=$row[‘month_sales’]?></td> </tr> </tbody> </таблица> </div> < ?php } } ?>

4. Я добавил реализацию таблицы. Вы можете увидеть это в ответе как редактирование.

5. Вау, спасибо за ответ. Я все еще новичок в PHP, но я учусь у других … 🙂 Дело в том, что мне действительно нужна таблица для каждого года … 🙂

Ответ №2:

Попробуйте это:

 foreach($year_array as $months_array)
{
echo 'year        '.$year_array[0];
foreach($months_array as $months)
{
echo 'monthsales        '.$months[0];
}
}
  

Комментарии:

1. Обычно лучше избегать встраивания циклов внутри циклов, потому что это снижает эффективность вашего алгоритма. Вот хороший ресурс, чтобы узнать больше, если вы хотите — bit.ly/bOow9P

2. @Stephen — Хотя я согласен, что это отличный сайт, вы только что ссылались примерно на 36 часов видео без намека на то, где найти информацию о встроенных циклах. Не хотите немного сузить круг поиска?

3. Это целый класс по алгоритмам, включая асимптотический анализ. О чем вы, вероятно, хотели бы знать, так это о нотации «Big O» и асимптотическом анализе — в нем описываются наиболее эффективные шаблоны и тому подобное

4. Начните с первого видео примерно в 17:20

5. (не по теме) @Синтаксическая ошибка — Я проверил ваш веб-сайт, и я думаю, вы должны увидеть эту статью bit.ly/d23hQC

Ответ №3:

printf можно было бы неплохо использовать для достижения этой цели. PHP.net в документах для sprintf подробно описаны параметры форматирования.

 foreach ($month_data as $m) {
    printf("%dn s $%.2lfn", $m['year'], $m['month'], $m['month_sales']);
}
  

Если вы хотите печатать только уникальные годы, как предложено в комментариях, вы могли бы попробовать это.

 $current_year = null;
foreach ($month_data as $m) {
    if ($current_year != $m['year']) {
        printf("%dn", $m['year']);
        $current_year = $m['year'];
    }
    printf(" s $%.2lfn", $m['month'], $m['month_sales']);
}
  

Комментарии:

1. Я думаю, он ищет способ отображать год только один раз, а не перед каждым месяцем.